我有以下标量函数:
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
现在,我想知道将它转换为表值函数是否更好,以便在执行时间方面提高数据库性能。
所以在这种情况下,如果我将它转换为表值函数,它会提高性能吗?它的执行时间是减少了吗?如果是这样,如何将其转换为表值函数?我有转换它的问题,因为我需要声明一个连接的变量。
答案 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,'');
答案 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
)
这可能会起作用,因为我的要求不同,我试图在其中进行编辑。希望最好。