SQL Server - 将标量函数转换为表值函数

Posted

技术标签:

【中文标题】SQL Server - 将标量函数转换为表值函数【英文标题】:SQL Server - Convert scalar function into table valued function 【发布时间】:2017-01-25 12:38:20 【问题描述】:

我有以下标量函数:

CREATE FUNCTION [dbo].[GetStringIds]
(
   @IdsTbl ids READONLY  
)
RETURNS nvarchar(800)
AS
BEGIN   
    DECLARE @IdsLst nvarchar(800);

    SELECT 
           @IdsLst = COALESCE(@IdsLst + ', ', '') + '(' + CAST(ID1 AS NVARCHAR) + ' : ' + CAST(ID2 AS NVARCHAR) + ')'
      FROM   
           @IdsTbl 

    Return @IdsLst 
END

一个表类型被传递给这个标量函数,它包含两个字段 ID1 和 ID2,都是 int 类型。该函数构建如下字符串:

(12:2)、(23:4)、(4:34)

注意: ID1可以重复但ID2不能重复,ID1+ID2是主键。例如:

ID1  | ID2
 1     100
 1     200
 1     110
 2     500
 3     200
 3     600

现在,我想知道是否最好将其转换为表值函数以提高数据库在执行时间方面的性能。

那么在这种情况下,如果我将其转换为表值函数,它会提高性能吗?它的执行时间会减少吗?如果是这样,如何将其转换为表值函数?我在转换它时遇到问题,因为我需要在其中声明一个连接变量。

【问题讨论】:

你要返回什么表?我的意思是,它将是什么列? 事实上,你不需要为了连接字符串而声明变量,因为有一些方法可以在没有变量的情况下连接来自查询的数据。例如***.com/questions/13639262/… @ZoharPeled 我要返回的表始终是一行一列,这一列是一个 nvarchar(连接结果)。 在这种情况下,您不需要表值函数。 那为什么要返回一个表呢? 【参考方案1】:

我通常使用这样的结构:

select 
    (select '' + '(' + CAST(ID1 AS NVARCHAR) + ' : ' + CAST(ID2 AS NVARCHAR) + ')'
        from @IdsTbl
        for xml path ('')
    )

【讨论】:

【参考方案2】:
create function dbo.GetStringIds (@IdsTbl dbo.ids readonly) 
  returns table as return
  select IdsLst = stuff(
    ( select ', (' + cast(id1 as nvarchar(13)) 
           + ' : ' + cast(id2 as nvarchar(13)) + ')'
      from @IdsTbl i
      for xml path (''), type).value('.','nvarchar(800)')
    ,1,2,'');

Inline Scalar Functions - Itzik Ben-Gan

【讨论】:

【参考方案3】:

你可以这样做,

CREATE FUNCTION [dbo].[GetStringIds] (@IdsTbl ids READONLY)
Returns Table
Return (
     SELECT 
       @IdsLst = COALESCE(@IdsLst + ', ', '') + '(' + CAST(ID1 AS NVARCHAR) + ' : ' + CAST(ID2 AS NVARCHAR) + ')'
  FROM   
       @IdsTbl 
)

这可能会起作用,因为我的要求不同,我试图在其中进行编辑。希望一切顺利。

【讨论】:

以上是关于SQL Server - 将标量函数转换为表值函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 自定义函数(Function)——参数默认值

SQL Server 自定义函数(Function)——参数默认值

数据库原理与应用(SQL Server)笔记 第十章 用户定义函数

如何将 Tsql 标量函数转换为表函数?

SQL Server 自定义函数

SQL Server 自定义函数