Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment créer une fonction SQL Server pour joindre plusieurs lignes d'une sous-requête en un seul champ délimité ?

Si vous utilisez SQL Server 2005, vous pouvez utiliser la commande FOR XML PATH.

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]

C'est beaucoup plus facile que d'utiliser un curseur et semble fonctionner assez bien.

Mettre à jour

Pour tous ceux qui utilisent encore cette méthode avec des versions plus récentes de SQL Server, il existe une autre façon de le faire qui est un peu plus facile et plus performante en utilisant le STRING_AGG méthode disponible depuis SQL Server 2017.

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

Cela permet également de spécifier un séparateur différent comme deuxième paramètre, offrant un peu plus de flexibilité par rapport à l'ancienne méthode.