SQL Server字符串连接方法
问题描述:
您需要将多行中的字符串聚合到单行中。COALESCE和FOR XML无法满足您的需求,并且Azure不支持CLR定义的聚合函数。您需要寻找最佳的替代方案。
解决方案:
使用标准Transact SQL,您可以通过以下步骤高效地连接字符串:
说明:
此方法使用三个CTE:
要使用此解决方案,您必须指定分组和排序标准。例如,在您的情况下,具有相同ID的行按字母顺序连接和排序。
示例:
考虑以下数据:
<code>ID Name -- -- 1 Matt 1 Rocks 2 Stylus 3 Foo 3 Bar 3 Baz</code>
查询及其输出如下:
WITH Partitioned AS ( SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber, COUNT(*) OVER (PARTITION BY ID) AS NameCount FROM dbo.SourceTable ), Concatenated AS ( SELECT ID, CAST(Name AS nvarchar(max)) AS FullName, Name, NameNumber, NameCount FROM Partitioned WHERE NameNumber = 1 UNION ALL SELECT P.ID, CAST(C.FullName + ', ' + P.Name AS nvarchar(max)), P.Name, P.NameNumber, P.NameCount FROM Partitioned AS P INNER JOIN Concatenated AS C ON P.ID = C.ID AND P.NameNumber = C.NameNumber + 1 ) SELECT ID, FullName FROM Concatenated WHERE NameNumber = NameCount;
<code>ID FullName -- ------------------------------ 2 Stylus 3 Bar, Baz, Foo 1 Matt, Rocks</code>
改进说明: 将nvarchar
类型改为nvarchar(max)
,以支持更长的字符串连接结果。 这避免了潜在的字符串长度溢出错误。
以上是如何在不使用 FOR XML 或 CLR 函数的情况下有效连接 SQL Server 中多行的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!