美文网首页
20170414_sqlserver中的表值函数和标量值函数

20170414_sqlserver中的表值函数和标量值函数

作者: Asa_Guo | 来源:发表于2017-04-18 08:31 被阅读0次

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

一、表值函数

用户定义表值函数返回 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

这个函数很简单返回一个整型值,然后就可以在存储过程中调用了,不过调用的方式有所不同,象上面的表值函数调用是不需要所有者的,只要写函数名称就可以,对于标量值函数来说,是需要加上所有者的,比如所有者是dbo
select dbo.testGetSubNodes_,这样就可以返回5,如果不加dbo,那sql会不认识这个函数。
再来一个标量值函数:

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())来使用。

相关文章

  • 20170414_sqlserver中的表值函数和标量值函数

    顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 一、表值函数 用户定义表值函数返回 table 数据类型...

  • SQL SERVER 自定义函数

    sql server自定义函数分三种(注意returns,需要加's'):标量值函数,内联式表值函数,多语句表值函...

  • DAX 权威指南 | 03 使用基本表函数

    在本章中,您将学习DAX中标量函数和表函数之间的区别。表函数对于DAX中的内部计算非常重要,当您为度量值或计算列编...

  • POWERBI笔记:新建列、度量值、聚合函数、 '表名'[列名]

    一、新建列中 分别使用:度量值 和 聚合函数 结果分别为:可变值(传入整个模型表数据,配合上下文进行计算) 和 固...

  • 闭包

    一、概念 go中的闭包可以理解为一个返回值也是函数的函数中,这个返回值的函数引用的是外层函数中的变量值,则称这个返...

  • 向量值函数笔记: L^p空间

    这是向量值函数(B值函数)系列笔记的第二篇. 为方便阅读, 这里放出目录:(1)向量值函数笔记: Bochner积...

  • 向量值函数笔记:Sobolev空间

    这是向量值函数(B值函数)系列笔记的第三篇. 为方便阅读, 这里放出目录:(1)向量值函数笔记: Bochner积...

  • 向量值函数笔记: Bochner积分

    这是向量值函数(B值函数)系列笔记的第一篇. 为方便阅读, 这里放出目录:(1)向量值函数笔记: Bochner积...

  • DAX从入门到精通 3-1-1 介绍表函数

    第三章 使用基本的表格函数 本章,我们要学习值函数和表函数,以及它们的区别。表函数对DAX中实现内部计算非常有用,...

  • pyv8执行js

    一、拿到函数返回值 匿名函数,与有名函数均可; 例如: 执行结果:425365.67053089二、拿到变量值:

网友评论

      本文标题:20170414_sqlserver中的表值函数和标量值函数

      本文链接:https://www.haomeiwen.com/subject/thkwattx.html