Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menggabungkan Rentetan dengan Cekap daripada Berbilang Baris dalam Pelayan SQL Tanpa Fungsi CLR?

Bagaimana untuk Menggabungkan Rentetan dengan Cekap daripada Berbilang Baris dalam Pelayan SQL Tanpa Fungsi CLR?

Susan Sarandon
Susan Sarandonasal
2025-01-20 09:01:08482semak imbas

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

Penggabungan Rentetan Berprestasi Tinggi dalam Pelayan SQL: Melangkaui Had CLR

Mengagregatkan rentetan daripada berbilang baris ke dalam rentetan tunggal ialah tugas SQL Server yang kerap. Walaupun kaedah seperti COALESCE dan FOR XML PATH wujud, mereka sering gagal dari segi kecekapan. Ini benar terutamanya dalam SQL Azure, yang tidak mempunyai sokongan untuk fungsi CLR, menghapuskan penyelesaian berprestasi tinggi biasa.

Alternatif Berkesan: Pendekatan CTE Rekursif

Alternatif yang teguh dan cekap memanfaatkan Ungkapan Jadual Biasa (CTE) rekursif. Teknik ini melibatkan langkah-langkah utama ini:

  1. Penomboran Baris dan Pembahagian: Berikan nombor baris unik kepada setiap nama dalam setiap partition ID yang berbeza.
  2. Pengagregatan Rentetan Rekursif: Menggabungkan rentetan secara rekursif dengan mencantumkan sekatan berdasarkan nombor baris berjujukan.
  3. Penapisan Hasil: Memilih hanya rentetan gabungan terakhir untuk setiap partition.

Kaedah ini menjamin hasil yang konsisten melalui pengumpulan dan pengisihan yang jelas.

Pelaksanaan Praktikal:

Berikut ialah contoh pelaksanaan menggunakan CTE rekursif:

<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 rekursif ini menyediakan penyelesaian berskala dan cekap untuk penggabungan rentetan dalam SQL Server, terutamanya dalam persekitaran di mana fungsi CLR tidak tersedia. Perhatikan penggunaan nvarchar(max) untuk mengendalikan rentetan bersambung yang berpotensi besar.

Atas ialah kandungan terperinci Bagaimana untuk Menggabungkan Rentetan dengan Cekap daripada Berbilang Baris dalam Pelayan SQL Tanpa Fungsi CLR?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn