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

时间:2017-01-25 12:38:21

标签: sql-server sql-server-2008 sql-server-2008-r2 user-defined-functions table-valued-parameters

我有以下标量函数:

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

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

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

3 个答案:

答案 0 :(得分:0)

我通常使用这样的结构:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你可以这样做,

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

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

相关问题