Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erstelle ich eine SQL Server-Funktion, um mehrere Zeilen aus einer Unterabfrage in einem einzigen durch Trennzeichen getrennten Feld zusammenzuführen?

Wenn Sie SQL Server 2005 verwenden, können Sie den Befehl FOR XML PATH verwenden.

SELECT [VehicleID]
     , [Name]
     , (STUFF((SELECT CAST(', ' + [City] AS VARCHAR(MAX)) 
         FROM [Location] 
         WHERE (VehicleID = Vehicle.VehicleID) 
         FOR XML PATH ('')), 1, 2, '')) AS Locations
FROM [Vehicle]

Es ist viel einfacher als die Verwendung eines Cursors und scheint ziemlich gut zu funktionieren.

Aktualisieren

Für alle, die diese Methode noch mit neueren Versionen von SQL Server verwenden, gibt es eine etwas einfachere und performantere Möglichkeit, dies mit dem STRING_AGG zu tun Methode, die seit SQL Server 2017 verfügbar ist.

SELECT  [VehicleID]
       ,[Name]
       ,(SELECT STRING_AGG([City], ', ')
         FROM [Location]
         WHERE VehicleID = V.VehicleID) AS Locations
FROM   [Vehicle] V

Dadurch kann auch ein anderes Trennzeichen als zweiter Parameter angegeben werden, was gegenüber der vorherigen Methode etwas mehr Flexibilität bietet.