Heim >Datenbank >MySQL-Tutorial >Wie kann ich in SQL Server mehrere Unterabfragezeilen in einem einzigen durch Trennzeichen getrennten Feld kombinieren?

Wie kann ich in SQL Server mehrere Unterabfragezeilen in einem einzigen durch Trennzeichen getrennten Feld kombinieren?

Barbara Streisand
Barbara StreisandOriginal
2025-01-22 00:19:16577Durchsuche

How Can I Combine Multiple Subquery Rows into a Single Delimited Field in SQL Server?

SQL Server: Kombinieren mehrerer Unterabfragezeilen in einem einzigen durch Trennzeichen getrennten Feld

In diesem Artikel werden verschiedene Methoden zum Verketten von Zeilen aus einer Unterabfrage in einem einzelnen durch Trennzeichen getrennten Feld in SQL Server untersucht. Wir untersuchen Techniken, die für verschiedene SQL Server-Versionen geeignet sind.

Methode 1: FOR XML PATH (SQL Server 2005 und höher)

Dieser klassische Ansatz verwendet FOR XML PATH, um Ergebnisse effizient zu verketten:

<code class="language-sql">SELECT 
    [VehicleID],
    [Name],
    STUFF((SELECT ', ' + [City]
           FROM [Location]
           WHERE (VehicleID = Vehicle.VehicleID)
           FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Locations
FROM [Vehicle]</code>

Methode 2: STRING_AGG (SQL Server 2017 und höher)

Für neuere SQL Server-Versionen bietet STRING_AGG eine besser lesbare und oft schnellere Lösung:

<code class="language-sql">SELECT  
    [VehicleID],
    [Name],
    STRING_AGG([City], ', ') AS Locations
FROM   
    [Vehicle] V
JOIN
    [Location] L ON V.VehicleID = L.VehicleID
GROUP BY
    [VehicleID], [Name]</code>

Beachten Sie die Verwendung eines JOIN hier für eine verbesserte Leistung im Vergleich zu einer Unterabfrage in diesem speziellen Fall.

Methode 3: Benutzerdefinierte Funktion (alle SQL Server-Versionen)

Für maximale Wiederverwendbarkeit über verschiedene SQL Server-Versionen und -Szenarien hinweg bietet eine benutzerdefinierte Funktion Flexibilität:

<code class="language-sql">CREATE FUNCTION dbo.JoinRows (@Subquery NVARCHAR(MAX), @Delimiter NVARCHAR(1))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @Result NVARCHAR(MAX) = '';
    DECLARE @Row NVARCHAR(MAX);
    DECLARE @NextRow CURSOR;

    SET @NextRow = CURSOR FOR SELECT [Value] FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', @Subquery);

    OPEN @NextRow;
    FETCH NEXT FROM @NextRow INTO @Row;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @Result += @Row + @Delimiter;
        FETCH NEXT FROM @NextRow INTO @Row;
    END;

    CLOSE @NextRow;
    DEALLOCATE @NextRow;

    RETURN STUFF(@Result, LEN(@Result), LEN(@Delimiter), ''); -- Remove trailing delimiter
END;
GO</code>

Diese Funktion verwendet OPENROWSET, um die dynamische Unterabfrage auszuführen. Dies ist sicherer als die direkte Ausführung von dynamischem SQL. Die Funktion kann dann wie folgt verwendet werden:

<code class="language-sql">SELECT 
    VehicleID, 
    Name, 
    dbo.JoinRows((SELECT City FROM Location WHERE VehicleID = Vehicle.VehicleID), ',') AS Locations
FROM Vehicle;</code>

Wählen Sie die Methode, die am besten zu Ihrer SQL Server-Version und Ihren Leistungsanforderungen passt. Für SQL Server 2017 und höher wird STRING_AGG aufgrund seiner Einfachheit und Leistung im Allgemeinen empfohlen. Für ältere Versionen oder komplexere Szenarien bietet die benutzerdefinierte Funktion eine robuste und wiederverwendbare Lösung.

Das obige ist der detaillierte Inhalt vonWie kann ich in SQL Server mehrere Unterabfragezeilen in einem einzigen durch Trennzeichen getrennten Feld kombinieren?. 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