sql server 中的表值函数和标量值函数
顾名思义:表值函数返回的是表,而标量值函数可以返回基类型
一、表值函数
用户定义表值函数返回 table 数据类型。对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。
以下示例创建了一个内联表值函数。此函数的输入参数为客户(商店)ID,而返回 ProductID
、Name
以及 YTD Total
(销售到商店的每种产品的本年度节截止到现在的销售总额)列。

- USE AdventureWorks;
- GO
- CREATE FUNCTION Sales.fn_SalesByStore (@storeid int)
- RETURNS TABLE
- AS
- RETURN
- (
- SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'YTD Total'
- FROM Production.Product AS P
- JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
- JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
- WHERE SH.CustomerID = @storeid
- GROUP BY P.ProductID, P.Name
- );
- GO

- 以下示例调用此函数并指定客户 ID 为 602
- SELECT * FROM Sales.fn_SalesByStore (602);
对于多语句表值函数,在 BEGIN...END 语句块中定义的函数体包含一系列 Transact-SQL 语句,这些语句可生成行并将其插入将返回的表中。
以下示例创建了一个表值函数。此函数具有一个输入参数 EmployeeID
而返回直接或间接向指定员工报告的所有员工的列表。

- USE AdventureWorks;
- GO
- CREATE FUNCTION dbo.fn_FindReports (@InEmpID INTEGER)
- RETURNS @retFindReports TABLE
- (
- EmployeeID int primary key NOT NULL,
- Name nvarchar(255) NOT NULL,
- Title nvarchar(50) NOT NULL,
- EmployeeLevel int NOT NULL,
- Sort nvarchar (255) NOT NULL
- )
- --Returns a result set that lists all the employees who report to the
- --specific employee directly or indirectly.*/
- AS
- BEGIN
- WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort) AS
- (SELECT CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName),
- e.Title,
- e.EmployeeID,
- 1,
- CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName)
- FROM HumanResources.Employee AS e
- JOIN Person.Contact AS c ON e.ContactID = c.ContactID
- WHERE e.EmployeeID = @InEmpID
- UNION ALL
- SELECT CONVERT(Varchar(255), REPLICATE ('| ' , EmployeeLevel) +
- c.FirstName + ' ' + c.LastName),
- e.Title,
- e.EmployeeID,
- EmployeeLevel + 1,
- CONVERT (Varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' +
- LastName)
- FROM HumanResources.Employee as e
- JOIN Person.Contact AS c ON e.ContactID = c.ContactID
- JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
- )
- -- copy the required columns to the result of the function
- INSERT @retFindReports
- SELECT EmployeeID, Name, Title, EmployeeLevel, Sort
- FROM DirectReports
- RETURN
- END;
- GO

- 在以下示例中,调用了此函数。
- -- Example invocation
- SELECT EmployeeID, Name, Title, EmployeeLevel
- FROM dbo.fn_FindReports(109)
- ORDER BY Sort;
- 二、标量值函数

- CREATE FUNCTION [dbo].[testGetSubNodes_]
- (
- @nodeId int
- )
- RETURNS int
- AS
- BEGIN
- declare @nodeCount int
- select @nodeCount=5 from MenuTree
- return @nodeCount
- END


- CREATE FUNCTION FUN_DataFormat (@strDate datetime)
- RETURNS varchar(20) AS
- BEGIN
- declare @date varchar(20)
- set @date = DATENAME(YY,@strDate)+'年'+Convert(VARCHAR,MONTH(@strDate))+'月'+Convert(VARCHAR,DAY(@strDate))+'日'
- return @date
- END

可以通过select dbo.FUN_DataFormat(getdate())来使用。
sql server 中的表值函数和标量值函数的更多相关文章
- SQL表值函数和标量值函数的区别
SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的, ...
- Sql Server 中一个非常强大的日期格式化函数
Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0)-- 05 16 2006 10:57AMSelect CONV ...
- SqlServer还原数据库时提示:异常终止,不能在此版本的SQL Server中启动,因为它包含分区函数
场景 在SqlServer Management中进行数据库还原时提示: 数据库不能在此版本的SQL Server中启动,因为它包含分区函数. 点击左下角的查看详细信息 实现 电脑上安装的是SQL S ...
- sqlserver 表值函数与标量值函数
除了在我们常用的程序开发中要用到函数外,在sql语句中也常用到函数,不论哪种,思想都没有变,都是为了封装,可复用. 创建的方法和整体结构都大体相同,都少不了函数名,函数的形参,返回值等这些. 一.表值 ...
- sqlserver自定义函数(标量值函数,表值函数)
用户自定义的函数有两类:表值函数.标量值函数. 表值函数:返回值是数据表的函数 调用方式 select b.* from tableA a accross apply Fun_BiaoZhiFun ...
- sql中的表值函数与标量值函数区别与用法
通俗来讲: 听名字就知道区别了 表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂:标量值函数返回的只是一个值 一 .表值函数又分为内联函数与多语句函数 (1 ...
- sql 表值函数与标量值函数
写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量 ...
- sqlserver中的表值函数和标量值函数
顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 一.表值函数 用户定义表值函数返回 table 数据类型.对于内联表值函数,没有函数主体:表是单个 SELECT 语句的结果集. 以下示例创建 ...
- SQL Server中使用表值函数
函数有很多限制,不能使用动态语句,不能使用临时表等等...细看一下,直接写语句就行了,不用动态语句 insert into @re select id,parid,@I from videoclass ...
随机推荐
- JAVA day1 基础知识
一.windows命令 dir:查看文件 cd:打开文件 二.java的编译和运行 编译: javac 源文件名 一个类编译后会对应一个.class文件 运行: java 类名 三.类 一个源文件内可 ...
- InnoDB的MVCC实现原理
InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的. 这两个列,一个保存了行的创建时间,一个保存了行的过期时间(删除时间).当然存储的并不是实际时间,而是系统版本号(sytem ve ...
- (转)nginx与PHP的关系
php是一门编程语言,可以编写很多程序,但是只有php的话,你的php只能在你的服务器里孤立的运行,比如你用php写了一个可以通过身高计算人的标准体重的程序,虽然这个程序可以在服务器运行,但是他还不能 ...
- 分享大麦UWP版本开发历程-02.内容“高度/宽度”不同的列表展示
一个成型的产品,肯定是经过了产品经理出的UE,美工设计的UI,最终到我们手里Coding,这里面最少3个人,最多就不知道会有多少人参与了.每个人脑子想的都是不一样的,我就不粘贴那个“XX眼中的XX”那 ...
- C# 文件类中 File ,FileInfo 类的主要区别
System.IO命名空间中提供的文件操作类有File和FileInfo,这两个类的功能基本相同,只是File是静态类,其中所有方法都是静态的,可以通过类名直接调用,不需要实例化.而FileInfo是 ...
- System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常。如果您在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。
代码异常描述 ************** 异常文本 **************System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常.如果 ...
- TCP 为什么需要三次握手而不是两次
我的理解: A 发送给B SYN, 然后B回复A ACK, 假设这两次握手已经完成, 但是B不知道A是否收到ACK就开始 recv , 这样就是空等 算是死循环吧??
- SQL*Plus 格式化查询结果
为了在 SQL*Plus 环境中生成符合用户需要规范的报表,SQL*Plus 工具提供了多个用于格式化查询结果的命令,使用这些命令可以实现设置列的标题.定义输出值的显示格式和显示宽度.为报表增加头标题 ...
- Jwt Token 令牌
/* 采用JWT的生成TOKEN,及APP登录Token的生成和解析 */ public class JwtTokenUtil { /** * token秘钥 */ public static fin ...
- UCOSIII消息队列
任务间消息传递2种途径 全局变量 发布消息 主结构体 typedef struct os_q OS_Q; struct os_q { /* Message Queue */ OS_OBJ_TYPE T ...