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

Nome da coluna dinâmica do SQL Server Pivot ( UNPIVOT ) para um valor de linha


Então você tem alguns problemas... o primeiro é que isso requer sql dinâmico porque a tabela e as colunas não são conhecidas com antecedência, então você não pode simplesmente usar um simples unpivot.

Isso também significa que você terá que obter os nomes das colunas das tabelas do sistema.

Seu segundo problema é que todos os seus tipos de dados são desconhecidos, então você tem que converter todas as colunas para algo que possa suportar tudo e qualquer tamanho... varchar(max).

Então, com esses dois obstáculos em mente, aqui está uma solução:
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, não posso em sã consciência recomendar uma solução que use sql dinâmico sem avisar dos perigos envolvidos em tal (tanto do ponto de vista do desempenho quanto do potencial de injeção). Leia este excelente artigo se quiser aumentar seus conhecimentos sobre o assunto.

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