加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 13:44:14 所属栏目:MsSql教程 来源:网络整理
导读:顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 一、表值函数 用户定义表值函数返回 table 数据类型。对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。 以下示例创建了一个内联表值函数。此函数的输入参数为客户(商店)ID,而

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

一、表值函数

用户定义表值函数返回 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?而返回直接或间接向指定员工报告的所有员工的列表。

FUNCTION dbo.fn_FindReports (@InEmpID INTEGER) @retFindReports TABLE ( EmployeeID int primary key NOT NULL,Name nvarchar(255) 50) int nvarchar (NULL ) --Returns a result set that lists all the employees who report to the --specific employee directly or indirectly.*/ BEGIN WITH DirectReports(Name,Title,EmployeeID,EmployeeLevel,Sort) AS (SELECT CONVERT(Varchar(255),c.FirstName + ' ' + c.LastName),e.Title,e.EmployeeID,1,+ c.LastName) FROM HumanResources.Employee AS e JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID @InEmpID UNION ALL REPLICATE (| ',EmployeeLevel) + c.FirstName + CONVERT (RTRIM(Sort) + FirstName + LastName) as e = 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,Sort FROM DirectReports RETURN END; 在以下示例中,调用了此函数。
-- Example invocation
SELECT EmployeeID,EmployeeLevel
FROM dbo.fn_FindReports(109)
ORDER BY Sort;

二、标量值函数
写一个标量值函数 FUNCTION [dbo].testGetSubNodes_] ( @nodeId int ) int BEGIN declare @nodeCount int select @nodeCount=5 from MenuTree return @nodeCount END

复制代码

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

复制代码

FUNCTION FUN_DataFormat (@strDate datetime)  
varchar(20)  AS  
BEGIN 
    
    @date 20)
      set @date = DATENAME(YY,@strDate)+'Convert(VARCHAR,255); line-height:1.5!important">MONTH(@strDate))DAY(@date
END

复制代码

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


转自:http://www.cnblogs.com/tianguook/p/5166515.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读