Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como criar uma função do SQL Server para unir várias linhas de uma subconsulta em um único campo delimitado?


Se você estiver usando o SQL Server 2005, poderá usar o 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]

É muito mais fácil do que usar um cursor e parece funcionar muito bem.

Atualizar

Para quem ainda usa esse método com versões mais recentes do SQL Server, há outra maneira de fazer isso que é um pouco mais fácil e com melhor desempenho usando o STRING_AGG método que está disponível desde o SQL Server 2017.
SELECT  [VehicleID]
       ,[Name]
       ,(SELECT STRING_AGG([City], ', ')
         FROM [Location]
         WHERE VehicleID = V.VehicleID) AS Locations
FROM   [Vehicle] V

Isso também permite que um separador diferente seja especificado como segundo parâmetro, proporcionando um pouco mais de flexibilidade em relação ao método anterior.