首頁 >資料庫 >mysql教程 >如何在不使用 CLR 函數的情況下高效連接 SQL Server 中多行的字串?

如何在不使用 CLR 函數的情況下高效連接 SQL Server 中多行的字串?

Susan Sarandon
Susan Sarandon原創
2025-01-20 09:01:08476瀏覽

How to Efficiently Concatenate Strings from Multiple Rows in SQL Server Without CLR Functions?

SQL Server 中的高效能字串連線:繞過 CLR 限制

將多行中的字串聚合為單一字串是一項常見的 SQL Server 任務。雖然像 COALESCEFOR XML PATH 這樣的方法存在,但它們在效率方面往往不夠。 在 SQL Azure 中尤其如此,它缺乏對 CLR 函數的支持,從而消除了常見的高效能解決方案。

有效的替代方案:遞迴 CTE 方法

一個強大且高效的替代方案利用遞歸公共表表達式(CTE)。此技術涉及以下關鍵步驟:

  1. 行編號和分割區:為每個不同 ID 分割區中的每個名稱指派唯一的行號。
  2. 遞歸字串聚合:透過基於連續行號連接分區來遞歸連接字串。
  3. 結果過濾: 僅選擇每個分割區的最終連接字串。

此方法透過明確分組和排序來保證結果的一致性。

實際實作:

這是使用遞歸 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>

這種遞歸 CTE 為 SQL Server 中的字串連接提供了可擴展且高效的解決方案,特別是在 CLR 函數不可用的環境中。 請注意使用 nvarchar(max) 來處理可能較大的串聯字串。

以上是如何在不使用 CLR 函數的情況下高效連接 SQL Server 中多行的字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn