• sql server 中的表值函数和标量值函数


     

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

    一、表值函数

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

    以下示例创建了一个内联表值函数。此函数的输入参数为客户(商店)ID,而返回 ProductIDName以及 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())来使用。

  • 相关阅读:
    OCP-1Z0-051-V9.02-118题
    VC++ 获取临时目录
    VC++ UUID/GUID
    MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
    Win32 SDK程序中拖动Thin边框窗口来改变窗口大小
    HTML5 App实战(7):连连看
    MFC对话框Border类型(None、Thin、Resizing、Dialog Frame)对应的部分属性
    项目报错七
    Linux下如何查看高CPU占用率线程
    项目报错六
  • 原文地址:https://www.cnblogs.com/baili-luoyun/p/11212691.html
Copyright © 2020-2023  润新知