如何在不使用 FOR XML 或 CLR 函數的情況下有效連接 SQL Server 中多行的字串?
Jan 20, 2025 am 09:12 AMSQL Server字串連線方法
問題描述:
您需要將多行中的字串聚合到單行中。 COALESCE和FOR XML無法滿足您的需求,且Azure不支援CLR定義的聚合函數。您需要尋找最佳的替代方案。
解:
使用標準Transact SQL,您可以透過以下步驟有效地連接字串:
- 編號行:基於分組標準對資料進行分區,並在每個分區內分配行號。
- 遞歸連接:建立一個遞歸CTE,根據行號迭代連接字串。
- 篩選結果:只選擇具有最高行號的結果,確保完整的連接。
說明:
此方法使用三個CTE:
- Partitioned:為每個分區內的行分配行號。
- Concatenated:遞歸建構連接的字串。
- Final Result:篩選連接的行,只包含完整的結果。
要使用此解決方案,您必須指定分組和排序標準。例如,在您的情況下,具有相同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中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在 Linux 中運行 MySQl(有/沒有帶有 phpmyadmin 的 podman 容器)
