Diario de SQL Server

Concatenar valores en una misma consulta

Es muy frecuente tener que construir un campo que concatener los valores de una columna para varios registros. Una forma clásica de realizar esta acción (es decir, que funciona también para versiones antes de SQL Server 2005) es concatenar en una variable:

 

declare @Cadena varchar(8000)

select @Cadena = ''

 

select @Cadena = @Cadena + ',' + COLUMN_NAME

from INFORMATION_SCHEMA.COLUMNS

where TABLE_NAME = 'Tabla1'

ORDER BY ORDINAL_POSITION

select STUFF(@Cadena, 1, 1, '') as CadenaCampos

Desde SQL Server 2005, se puede solventar ese problema en una sóla consulta, haciendo uso de FOR XML PATH, lo que permite una mejor integración en consultas más complejas:

 

select STUFF(

(SELECT CAST(',' AS varchar(MAX)) + COLUMN_NAME

FROM INFORMATION_SCHEMA.COLUMNS

where TABLE_NAME = 'Tabla1'

ORDER BY ORDINAL_POSITION

FOR XML PATH('')

), 1, 1, '') as CadenaCampos

 

Un ejemplo de esa integración sería el siguiente:

 

Select Table_Name, STUFF(

(SELECT CAST(',' AS varchar(MAX)) + C.COLUMN_NAME

FROM INFORMATION_SCHEMA.COLUMNS C

where C.TABLE_NAME = T.TABLE_NAME

ORDER BY ORDINAL_POSITION

FOR XML PATH('')

), 1, 1, '') as CadenaCampos

from INFORMATION_SCHEMA.TABLES T

 

En esta línea se pueden hacer otras cosas más elaboradas, como por ejemplo, construir una sentencia pivot dinámica:

 

http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/d5544169-7068-4796-88ce-b6eafd0f0b8e

 

Comentarios

Muy bueno, gracias

Excelente solucion amigo, para mas de 108 000 registros con la primera forma se lleva mas de 6 minutos, y con tu sulucion solo hay que esperar 4 segundos :D gracias

Gracias!!! Me sirvio mucho, llevaba un día intentando resolverlo.

Añadir un Comentario: