Heim >Datenbank >MySQL-Tutorial >Wie kann ich Zeichenfolgen aus mehreren Zeilen in SQL Server effizient verketten, ohne FOR XML- oder CLR-Funktionen zu verwenden?
SQL Server-Methode zur Zeichenfolgenverkettung
Problembeschreibung:
Sie müssen Zeichenfolgen aus mehreren Zeilen in einer einzigen Zeile zusammenfassen. COALESCE und FOR XML erfüllen nicht das, was Sie benötigen, und Azure unterstützt keine CLR-definierten Aggregatfunktionen. Sie müssen nach der besten Alternative suchen.
Lösung:
Mit Standard-Transact-SQL können Sie Zeichenfolgen effizient verketten, indem Sie die folgenden Schritte ausführen:
Anleitung:
Diese Methode verwendet drei CTEs:
Um diese Lösung nutzen zu können, müssen Sie Gruppierungs- und Sortierkriterien angeben. In Ihrem Fall werden beispielsweise Zeilen mit derselben ID verkettet und alphabetisch sortiert.
Beispiel:
Berücksichtigen Sie die folgenden Daten:
<code>ID Name -- -- 1 Matt 1 Rocks 2 Stylus 3 Foo 3 Bar 3 Baz</code>
Die Abfrage und ihre Ausgabe lauten wie folgt:
<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>
<code>ID FullName -- ------------------------------ 2 Stylus 3 Bar, Baz, Foo 1 Matt, Rocks</code>
Beschreibung der Verbesserung: Ändern Sie den Typ nvarchar
in nvarchar(max)
, um längere Ergebnisse der Zeichenfolgenverkettung zu unterstützen. Dies vermeidet mögliche Fehler aufgrund eines Stringlängenüberlaufs.
Das obige ist der detaillierte Inhalt vonWie kann ich Zeichenfolgen aus mehreren Zeilen in SQL Server effizient verketten, ohne FOR XML- oder CLR-Funktionen zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!