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

Nombre de columna Dynamic SQL Server Pivot ( UNPIVOT ) a un valor de fila

Así que tiene un par de problemas... el primero es que esto requiere sql dinámico porque la tabla y las columnas no se conocen de antemano, por lo que no puede simplemente usar un despívot simple.

Eso también significa que tendrá que obtener los nombres de las columnas de las tablas del sistema.

Su segundo problema es que todos sus tipos de datos son desconocidos, por lo que debe convertir todas las columnas en algo que pueda admitir todo y cualquier longitud... varchar(max).

Entonces, con esos dos obstáculos en mente, aquí hay una solución:

declare @yourTable varchar(50)
declare @yourKeyField varchar(50)
declare @yourKey varchar(50)

set @yourTable = 'MyTable' /** change to tablename or pass as parameter */
set @yourKeyField = 'ID'   /** change to fieldname or pass as parameter */
set @yourKey = '5'         /** change to key value or pass as parameter */

declare @query nvarchar(max)  

select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as
[Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + ' 
where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c 
    inner join sysobjects o on c.id = o.id and o.xtype = 'u'
    where o.name = @yourTable order by c.colid

exec sp_executesql @query /** execute query */

Finalmente, no puedo recomendar en conciencia una solución que use sql dinámico sin advertir los peligros involucrados (tanto desde el punto de vista del rendimiento como del potencial de inyección). Lea este excelente artículo si desea aumentar sus conocimientos sobre el tema.

http://www.sommarskog.se/dynamic_sql.html