Heim >Datenbank >MySQL-Tutorial >Wie kann ich Zeichenfolgen aus mehreren Zeilen in SQL Server effizient verketten, ohne FOR XML- oder CLR-Funktionen zu verwenden?

Wie kann ich Zeichenfolgen aus mehreren Zeilen in SQL Server effizient verketten, ohne FOR XML- oder CLR-Funktionen zu verwenden?

DDD
DDDOriginal
2025-01-20 09:12:11922Durchsuche

How Can I Efficiently Concatenate Strings from Multiple Rows in SQL Server Without Using FOR XML or CLR Functions?

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:

  1. Nummerierte Zeilen: Partitionieren Sie die Daten anhand von Gruppierungskriterien und weisen Sie innerhalb jeder Partition Zeilennummern zu.
  2. Rekursiver Join: Erstellen Sie einen rekursiven CTE, der basierend auf Zeilennummern über die Join-Zeichenfolge iteriert.
  3. Ergebnisse filtern: Nur Ergebnisse mit der höchsten Zeilennummer werden ausgewählt, um vollständige Verbindungen sicherzustellen.

Anleitung:

Diese Methode verwendet drei CTEs:

  • Partitioniert: Weisen Sie Zeilen innerhalb jeder Partition Zeilennummern zu.
  • Verkettet: Erstellt rekursiv verkettete Zeichenfolgen.
  • Endergebnis: Filtert die verketteten Zeilen so, dass nur vollständige Ergebnisse enthalten sind.

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!

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