ホームページ >データベース >mysql チュートリアル >CLR 関数を使用せずに SQL Server の複数の行の文字列を効率的に連結するにはどうすればよいですか?

CLR 関数を使用せずに SQL Server の複数の行の文字列を効率的に連結するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-20 09:01:08472ブラウズ

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

SQL Server での高パフォーマンスの文字列連結: CLR 制限のバイパス

複数の行の文字列を 1 つの文字列に集約することは、SQL Server で頻繁に行われるタスクです。 COALESCEFOR XML PATH のようなメソッドは存在しますが、効率の点で不十分なことがよくあります。 これは特に SQL Azure に当てはまります。SQL Azure では CLR 関数がサポートされていないため、一般的な高パフォーマンスのソリューションが利用できません。

効果的な代替案: 再帰的 CTE アプローチ

堅牢で効率的な代替手段は、再帰的な Common Table Expression (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 は、特に CLR 関数が利用できない環境において、SQL Server での文字列連結のためのスケーラブルで効率的なソリューションを提供します。 nvarchar(max) を使用して、潜在的に大きな連結文字列を処理することに注意してください。

以上がCLR 関数を使用せずに SQL Server の複数の行の文字列を効率的に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。