Heim >Datenbank >MySQL-Tutorial >Wie können Zeichenfolgen aus mehreren Zeilen in SQL Server ohne CLR-Funktionen effizient verkettet werden?

Wie können Zeichenfolgen aus mehreren Zeilen in SQL Server ohne CLR-Funktionen effizient verkettet werden?

Susan Sarandon
Susan SarandonOriginal
2025-01-20 09:01:08482Durchsuche

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

Hochleistungsfähige Zeichenfolgenverkettung in SQL Server: Umgehen von CLR-Einschränkungen

Das Zusammenfassen von Zeichenfolgen aus mehreren Zeilen zu einer einzigen Zeichenfolge ist eine häufige SQL Server-Aufgabe. Obwohl es Methoden wie COALESCE und FOR XML PATH gibt, sind sie hinsichtlich der Effizienz oft unzureichend. Dies gilt insbesondere für SQL Azure, das keine Unterstützung für CLR-Funktionen bietet, wodurch eine übliche Hochleistungslösung entfällt.

Effektive Alternativen: Rekursiver CTE-Ansatz

Eine robuste und effiziente Alternative nutzt einen rekursiven Common Table Expression (CTE). Diese Technik umfasst die folgenden Schlüsselschritte:

  1. Zeilennummerierung und Partitionierung: Weist jedem Namen innerhalb jeder eindeutigen ID-Partition eine eindeutige Zeilennummer zu.
  2. Rekursive String-Aggregation: Verkettet Strings rekursiv, indem Partitionen basierend auf aufeinanderfolgenden Zeilennummern zusammengefügt werden.
  3. Ergebnisfilterung: Wählt nur die endgültige verkettete Zeichenfolge für jede Partition aus.

Diese Methode garantiert konsistente Ergebnisse durch explizite Gruppierung und Sortierung.

Praktische Umsetzung:

Hier ist eine Beispielimplementierung mit einem rekursiven 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>

Dieser rekursive CTE bietet eine skalierbare und effiziente Lösung für die Zeichenfolgenverkettung in SQL Server, insbesondere in Umgebungen, in denen CLR-Funktionen nicht verfügbar sind. Beachten Sie die Verwendung von nvarchar(max) zur Verarbeitung potenziell großer verketteter Zeichenfolgen.

Das obige ist der detaillierte Inhalt vonWie können Zeichenfolgen aus mehreren Zeilen in SQL Server ohne CLR-Funktionen effizient verkettet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn