Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come creare una funzione di SQL Server per unire più righe da una sottoquery in un unico campo delimitato?

Se stai usando SQL Server 2005, puoi usare il comando 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]

È molto più semplice che usare un cursore e sembra funzionare abbastanza bene.

Aggiorna

Per chiunque utilizzi ancora questo metodo con le versioni più recenti di SQL Server, c'è un altro modo per farlo che è un po' più semplice e performante usando il STRING_AGG metodo disponibile da SQL Server 2017.

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

Ciò consente anche di specificare un separatore diverso come secondo parametro, fornendo un po' più di flessibilità rispetto al metodo precedente.