【发布时间】:2018-07-24 18:59:13
【问题描述】:
我尝试创建一个通用函数,可以像 this example 在 SQL Server 2017 上使用新的 string_agg 内置函数一样使用
内部实现可以像下面这样
with tbl as(
select a.Id, c.Desc
from TableA a
join TableB b on b.aId = a.Id
join TableC c on c.Code = b.bCode
)
select distinct ID
, STUFF(( select ', ' + Desc from tbl t where t.ID = tbl.ID
for xml path(''),TYPE).value('.','VARCHAR(MAX)'),1,2,'') Desc
from tbl
但是如何接收字段键、要连接的字段、分隔符字符和范围选择上下文?
和Inline or Multi-Statement Table-Valued Functions有关系吗?
【问题讨论】:
-
可以通过 DLL 导入聚合函数。您必须用 C# 或其他 .NET 语言编写类,然后将其导入 SSMS。但是你不需要这样的功能,有一个很好的例子,如何使用
for xml子句聚合字符串。 -
无法在 T-SQL 中完成。您需要动态 SQL,而函数不能使用它。将
STRING_AGG添加到语言中是有原因的。自定义 CLR 聚合可以做到这一点,但在这种情况下,您无需重新发明轮子;网络上有很多这样的例子。 -
@JeroenMostert,好吧,做不到并不完全正确:-D(尽管我不推荐我的“解决方案”: -D)
-
@JeroenMostert 将子选择作为隐式转换的 XML 传递的想法可能非常有用。在this answer 中,我提供了一个通用函数,从您传入的任何
SELECT中创建一个HTML表。对于给定的情况,最好在语句中直接使用STUFF-FOR XML-hack,而不是调用 UDF...
标签: sql-server user-defined-functions string-aggregation