【发布时间】:2021-06-15 23:47:17
【问题描述】:
如何模拟string_agg函数?
我需要这个
[value]
1
2
3
进入这个
1,2,3
我试过了
CREATE TYPE stringArray AS TABLE ([value] nvarchar(255))
GO
CREATE FUNCTION dbo.ufn_join
(
@table stringArray readonly,
@separator nvarchar(5) = ','
)
RETURNS nvarchar(max)
AS
BEGIN
RETURN stuff((select @separator + value from @table for xml path('')), 1, 1, '')
END
GO
SELECT dbo.ufn_join(
(
SELECT cast(1 as nvarchar(255)) as value
UNION
SELECT cast(2 as nvarchar(255)) as value
UNION
SELECT cast(3 as nvarchar(255)) as value
)
, DEFAULT
)
但我遇到了一个错误
-- Error: Operand type clash: nvarchar is incompatible with stringArray
唯一的条件是我不想使用任何类型的变量。 CLR 函数也完全没问题,但我也有同样的问题,如何将 select 的返回值作为参数插入到函数中。
【问题讨论】:
-
您无法通过内联 TVP。
DECLARE @t stringArray; INSERT @t VALUES ...。如果您不喜欢这种语法,那么这种方法简直就是死路一条。 T-SQL 不相信语法糖。 -
有很多重复的问题,最终指向the same article by Aaron Bertrand。那里正确描述了 XML 选项。但是,您不能 将其转换为函数,或者将某些表名传递给它。 SQLCLR 是最快的选择
-
@TheGameiswar 我同意解决方案是相同的,但问题是不同的(有点)。 STRING_AGG 是 SQL Server 2017 函数,GROUP_CONCAT 是 MYSQL。很少有人在 google 搜索 STRING_AGG 的替代品会发现和/或从您发布的文章中受益。那是我的 0.02 美元
标签: sql-server sql-server-2008 tsql