Concatenar valores de columna en una lista separada por comas

¿Cuál es la syntax de TSQL para formatear mi salida para que los valores de columna aparezcan como una cadena, separados por comas?

Ejemplo, mi mesa CARS tiene lo siguiente:

CarID CarName ---------------- 1 Porsche 2 Mercedes 3 Ferrari 

¿Cómo obtengo los nombres de los automóviles como: Porsche, Mercedes, Ferrari

Puede hacer un atajo usando coalesce para concatenar una serie de cadenas de un registro en una tabla, por ejemplo.

 declare @aa varchar (200) set @aa = '' select @aa = case when @aa = '' then CarName else @aa + coalesce(',' + CarName, '') end from Cars print @aa 
 SELECT LEFT(Car, LEN(Car) - 1) FROM ( SELECT Car + ', ' FROM Cars FOR XML PATH ('') ) c (Car) 

Puedes hacer esto usando cosas:

 SELECT Stuff( ( SELECT ', ' + CARS.CarName FROM CARS FOR XML PATH('') ), 1, 2, '') AS CarNames 

Si está ejecutando SQL Server 2017 o Azure SQL Database, haga algo como esto:

  SELECT STRING_AGG(CarName,',') as CarNames FROM CARS 

Otra solución dentro de una consulta:

 select Id, STUFF( (select (', "' + od.ProductName + '"') from OrderDetails od (nolock) where od.Order_Id = o.Id order by od.ProductName FOR XML PATH('')), 1, 2, '' ) ProductNames from Orders o (nolock) where o.Customer_Id = 525188 order by o.Id desc 

(EDITAR: gracias @ user007 por la statement STUFF)

 DECLARE @CarList nvarchar(max); SET @CarList = N''; SELECT @CarList+=CarName+N',' FROM dbo.CARS; SELECT LEFT(@CarList,LEN(@CarList)-1); 

Gracias a quien en SO me mostró el uso de la acumulación de datos durante una consulta.

  DECLARE @SQL AS VARCHAR(8000) SELECT @SQL = ISNULL(@SQL+',','') + ColumnName FROM TableName SELECT @SQL 

Por favor intente esto con el siguiente código:

 DECLARE @listStr VARCHAR(MAX) SELECT @listStr = COALESCE(@listStr+',' , '') + CarName FROM Cars SELECT @listStr