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

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

一、表值函数

用户定义表值函数返回 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())来使用。

时间: 2024-12-19 21:07:10

sqlserver中的表值函数和标量值函数的相关文章

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

通俗来讲: 听名字就知道区别了 表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂:标量值函数返回的只是一个值 一 .表值函数又分为内联函数与多语句函数 (1)内联函数就是没有函数主体表是单个 SELECT. 下面是一个不带输入参数的表值函数 create function tvpoints() returns table as return ( select * from tb_users ); 调用-这个结果返回的是一张表: select * fro

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

写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量值函数可以返回基类型.举个例子,当用户删除一个节点的时候,是需要将当前节点下的所有子节点都删掉,如果程序只传一个当前节点,那就需要写一个函数来得到当前节点下的所有子节点,这些子节点的信息就可以放到一个表中返回. ALTER FUNCTION testGetSubNodes ( @nodeId int

(转)表值函数,标量值函数详解

顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 表值函数 用户定义表值函数返回 table 数据类型.对于内联表值函数,没有函数主体:表是单个 SELECT 语句的结果集. 以下示例创建了一个内联表值函数.此函数的输入参数为客户(商店)ID,而返回 ProductID.Name 以及 YTD Total(销售到商店的每种产品的本年度节截止到现在的销售总额)列. USE AdventureWorks; GO CREATE FUNCTION Sales.fn_SalesByStore (@

sql 表值函数与标量值函数

写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量值函数可以返回基类型. 举个例子,当用户删除一个节点的时候,是需要将当前节点下的所有子节点都删掉,如果程序只传一个当前节点,那就需要写一个函数来得到当前节点下的所有子节点,这些子节点的信息就可以放到一个表中返回. ALTER FUNCTION testGetSubNodes ( -- Add the

Sqlserver 中系统表sysobjects、syscolumns以及函数object_id

1.sysobjects 系统对象表. 保存当前数据库的对象,如约束.默认值.日志.规则.存储过程等 sysobjects 重要字段解释: sysObjects ( Name sysname, --object 名称 id int, --object id xtype char(2), -- object 类型 type char(2), -- Object 类型(与xtype 似乎一模一样) uid smallint, -- object 所有者的ID ... --其他的字段不常用到. ) ?

数据库创建标量值函数

1 create FUNCTION [dbo].[ispm] (@pmfrist int) 2 RETURNS int 3 AS 4 BEGIN 5 DECLARE @ISvalue int 6 if @pmfrist>0 and @pmfrist<11 7 begin 8 set @ISvalue=1 9 end 10 else 11 begin 12 set @ISvalue=0 13 end 14 RETURN(@ISvalue) 15 END 16 17 数据库创建标量值函数

表值函数,标量值函数

表值函数:ALTER FUNCTION getTable( )RETURNS TABLE ASRETURN ( select * from tb)取值:select * from getTable( )标量函数:ALTER FUNCTION [dbo].[CamOnlineAverage]   (      @projId INT ,      @startDate DATETIME ,      @endDate DATETIME    )RETURNS  Float ASBegin    

EF中使用数据库的标量值函数

参考资料:https://msdn.microsoft.com/zh-cn/library/dd456847(v=vs.110).aspx http://stackoverflow.com/questions/12481868/how-to-use-scalar-valued-function-with-linq-to-entity 1.首先修改edmx里添加的这个<Function>,将IsComposable属性改为false,去掉ReturnType属性,然后添加子节点<Comma

SQLServer中DataLength()和Len()两内置函数的区别(转载)

最近工作中遇到了个问题:在数据库中声明字段类型时char(4),但实际只存储了‘DCE’三个字母,程序中拼装以该字段作为key的Map中,会把‘DCE’+空格作为其Key,这样造成用没加空格的‘DCE’为key去取Value的值是取不出来的,结果是空.后来查看数据库字段类型才发现了问题所在.大家都知道,char和varchar的区别就在于一个是固定长度,一个是可变长度.在寻找问题的过程中,用到了我们今天要说的这两个内置函数,DataLength()和Len().在解释DataLength()和L