顾名思义:表值函数返回的是表,而标量值函数可以返回基类型

一、表值函数

用户定义表值函数返回 table 数据类型。对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。

以下示例创建了一个内联表值函数。此函数的输入参数为客户(商店)ID,而返回 ProductIDName以及 YTD Total(销售到商店的每种产品的本年度节截止到现在的销售总额)列。

  1. USE AdventureWorks;
  2. GO
  3. CREATE FUNCTION Sales.fn_SalesByStore (@storeid int)
  4. RETURNS TABLE
  5. AS
  6. RETURN
  7. (
  8. SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'YTD Total'
  9. FROM Production.Product AS P
  10. JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
  11. JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
  12. WHERE SH.CustomerID = @storeid
  13. GROUP BY P.ProductID, P.Name
  14. );
  15. GO
  1. 以下示例调用此函数并指定客户 ID 602
  1. SELECT * FROM Sales.fn_SalesByStore (602);
  1.  

对于多语句表值函数,在 BEGIN...END 语句块中定义的函数体包含一系列 Transact-SQL 语句,这些语句可生成行并将其插入将返回的表中。

以下示例创建了一个表值函数。此函数具有一个输入参数 EmployeeID 而返回直接或间接向指定员工报告的所有员工的列表。

  1. USE AdventureWorks;
  2. GO
  3. CREATE FUNCTION dbo.fn_FindReports (@InEmpID INTEGER)
  4. RETURNS @retFindReports TABLE
  5. (
  6. EmployeeID int primary key NOT NULL,
  7. Name nvarchar(255) NOT NULL,
  8. Title nvarchar(50) NOT NULL,
  9. EmployeeLevel int NOT NULL,
  10. Sort nvarchar (255) NOT NULL
  11. )
  12. --Returns a result set that lists all the employees who report to the
  13. --specific employee directly or indirectly.*/
  14. AS
  15. BEGIN
  16. WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort) AS
  17. (SELECT CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName),
  18. e.Title,
  19. e.EmployeeID,
  20. 1,
  21. CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName)
  22. FROM HumanResources.Employee AS e
  23. JOIN Person.Contact AS c ON e.ContactID = c.ContactID
  24. WHERE e.EmployeeID = @InEmpID
  25. UNION ALL
  26. SELECT CONVERT(Varchar(255), REPLICATE ('| ' , EmployeeLevel) +
  27. c.FirstName + ' ' + c.LastName),
  28. e.Title,
  29. e.EmployeeID,
  30. EmployeeLevel + 1,
  31. CONVERT (Varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' +
  32. LastName)
  33. FROM HumanResources.Employee as e
  34. JOIN Person.Contact AS c ON e.ContactID = c.ContactID
  35. JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
  36. )
  37. -- copy the required columns to the result of the function
  38. INSERT @retFindReports
  39. SELECT EmployeeID, Name, Title, EmployeeLevel, Sort
  40. FROM DirectReports
  41. RETURN
  42. END;
  43. GO
  1. 在以下示例中,调用了此函数。
  1. -- Example invocation
  2. SELECT EmployeeID, Name, Title, EmployeeLevel
  3. FROM dbo.fn_FindReports(109)
  4. ORDER BY Sort;
  5.  
  6. 二、标量值函数
写一个标量值函数
  1. CREATE FUNCTION [dbo].[testGetSubNodes_]
  2. (
  3. @nodeId int
  4. )
  5. RETURNS int
  6. AS
  7. BEGIN
  8. declare @nodeCount int
  9. select @nodeCount=5 from MenuTree
  10. return @nodeCount
  11. END
这个函数很简单返回一个整型值,然后就可以在存储过程中调用了,不过调用的方式有所不同,象上面的表值函数调用是不需要所有者的,只要写函数名称就可以,对于标量值函数来说,是需要加上所有者的,比如所有者是dbo
select dbo.testGetSubNodes_,这样就可以返回5,如果不加dbo,那sql会不认识这个函数。
再来一个标量值函数:
  1. CREATE FUNCTION FUN_DataFormat (@strDate datetime)
  2. RETURNS varchar(20) AS
  3. BEGIN
  4.  
  5. declare @date varchar(20)
  6. set @date = DATENAME(YY,@strDate)+'年'+Convert(VARCHAR,MONTH(@strDate))+'月'+Convert(VARCHAR,DAY(@strDate))+'日'
  7. return @date
  8. END

可以通过select dbo.FUN_DataFormat(getdate())来使用。

sql server 中的表值函数和标量值函数的更多相关文章

  1. SQL表值函数和标量值函数的区别

    SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的, ...

  2. Sql Server 中一个非常强大的日期格式化函数

    Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0)-- 05 16 2006 10:57AMSelect CONV ...

  3. SqlServer还原数据库时提示:异常终止,不能在此版本的SQL Server中启动,因为它包含分区函数

    场景 在SqlServer Management中进行数据库还原时提示: 数据库不能在此版本的SQL Server中启动,因为它包含分区函数. 点击左下角的查看详细信息 实现 电脑上安装的是SQL S ...

  4. sqlserver 表值函数与标量值函数

    除了在我们常用的程序开发中要用到函数外,在sql语句中也常用到函数,不论哪种,思想都没有变,都是为了封装,可复用. 创建的方法和整体结构都大体相同,都少不了函数名,函数的形参,返回值等这些. 一.表值 ...

  5. sqlserver自定义函数(标量值函数,表值函数)

    用户自定义的函数有两类:表值函数.标量值函数. 表值函数:返回值是数据表的函数 调用方式 select  b.*  from tableA a accross apply Fun_BiaoZhiFun ...

  6. sql中的表值函数与标量值函数区别与用法

    通俗来讲: 听名字就知道区别了 表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂:标量值函数返回的只是一个值 一 .表值函数又分为内联函数与多语句函数 (1 ...

  7. sql 表值函数与标量值函数

    写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量 ...

  8. sqlserver中的表值函数和标量值函数

    顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 一.表值函数 用户定义表值函数返回 table 数据类型.对于内联表值函数,没有函数主体:表是单个 SELECT 语句的结果集. 以下示例创建 ...

  9. SQL Server中使用表值函数

    函数有很多限制,不能使用动态语句,不能使用临时表等等...细看一下,直接写语句就行了,不用动态语句 insert into @re select id,parid,@I from videoclass ...

随机推荐

  1. JAVA day1 基础知识

    一.windows命令 dir:查看文件 cd:打开文件 二.java的编译和运行 编译: javac 源文件名 一个类编译后会对应一个.class文件 运行: java 类名 三.类 一个源文件内可 ...

  2. InnoDB的MVCC实现原理

    InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的. 这两个列,一个保存了行的创建时间,一个保存了行的过期时间(删除时间).当然存储的并不是实际时间,而是系统版本号(sytem ve ...

  3. (转)nginx与PHP的关系

    php是一门编程语言,可以编写很多程序,但是只有php的话,你的php只能在你的服务器里孤立的运行,比如你用php写了一个可以通过身高计算人的标准体重的程序,虽然这个程序可以在服务器运行,但是他还不能 ...

  4. 分享大麦UWP版本开发历程-02.内容“高度/宽度”不同的列表展示

    一个成型的产品,肯定是经过了产品经理出的UE,美工设计的UI,最终到我们手里Coding,这里面最少3个人,最多就不知道会有多少人参与了.每个人脑子想的都是不一样的,我就不粘贴那个“XX眼中的XX”那 ...

  5. C# 文件类中 File ,FileInfo 类的主要区别

    System.IO命名空间中提供的文件操作类有File和FileInfo,这两个类的功能基本相同,只是File是静态类,其中所有方法都是静态的,可以通过类名直接调用,不需要实例化.而FileInfo是 ...

  6. System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常。如果您在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。

    代码异常描述  ************** 异常文本 **************System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常.如果 ...

  7. TCP 为什么需要三次握手而不是两次

    我的理解: A 发送给B SYN, 然后B回复A ACK,  假设这两次握手已经完成,  但是B不知道A是否收到ACK就开始  recv  , 这样就是空等  算是死循环吧??

  8. SQL*Plus 格式化查询结果

    为了在 SQL*Plus 环境中生成符合用户需要规范的报表,SQL*Plus 工具提供了多个用于格式化查询结果的命令,使用这些命令可以实现设置列的标题.定义输出值的显示格式和显示宽度.为报表增加头标题 ...

  9. Jwt Token 令牌

    /* 采用JWT的生成TOKEN,及APP登录Token的生成和解析 */ public class JwtTokenUtil { /** * token秘钥 */ public static fin ...

  10. UCOSIII消息队列

    任务间消息传递2种途径 全局变量 发布消息 主结构体 typedef struct os_q OS_Q; struct os_q { /* Message Queue */ OS_OBJ_TYPE T ...