zoukankan      html  css  js  c++  java
  • sqlserver中的表值函数和标量值函数

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

    一、表值函数

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

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

    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 语句,这些语句可生成行并将其插入将返回的表中。

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

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

  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/zhangzhiping35/p/10656262.html
Copyright © 2011-2022 走看看