SQL Azure 字符串高效连接方案
在SQL Azure中,高效地将分散的字符串数据聚合为单个实体至关重要。由于SQL Azure中缺乏CLR自定义聚合函数,因此需要寻找高效的替代方案。
Transact SQL解决方案
一种高效的方法是使用WITH子句和递归CTE(公共表表达式)。此方法包括:
说明
请考虑以下查询:
<code class="language-sql">;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>
示例
对于以下数据:
<code>ID Name ------- -------- 1 Matt 1 Rocks 2 Stylus 3 Foo 3 Bar 3 Baz</code>
返回以下聚合结果:
<code>ID FullName ------- --------------------- 1 Matt, Rocks 2 Stylus 3 Foo, Bar, Baz</code>
优点
注意:为了避免nvarchar数据类型长度溢出,将CAST的类型修改为nvarchar(max)。 另外,示例结果中的排序与原文略有不同,这是因为ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) 的排序依据是Name字段,导致了排序结果的差异。 如果需要特定的排序方式,请修改ORDER BY子句。
以上是如何在不使用 CLR 聚合函数的情况下在 SQL Azure 中最佳地连接字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!