sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo crear una función de SQL Server para unir varias filas de una subconsulta en un solo campo delimitado?

Si usa SQL Server 2005, puede usar el 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]

Es mucho más fácil que usar un cursor y parece funcionar bastante bien.

Actualizar

Para cualquiera que todavía use este método con versiones más nuevas de SQL Server, hay otra forma de hacerlo que es un poco más fácil y más eficaz usando el STRING_AGG método que ha estado disponible desde SQL Server 2017.

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

Esto también permite especificar un separador diferente como segundo parámetro, proporcionando un poco más de flexibilidad con respecto al método anterior.