Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Nome della colonna pivot dinamico di SQL Server (UNPIVOT) su un valore di riga

Quindi hai un paio di problemi... il primo è che questo richiede un sql dinamico perché la tabella e le colonne non sono note in anticipo, quindi non puoi semplicemente usare un semplice unpivot.

Ciò significa anche che dovrai ottenere i nomi delle colonne dalle tabelle di sistema.

Il tuo secondo problema è che tutti i tuoi tipi di dati sono sconosciuti, quindi devi eseguire il cast di tutte le colonne su qualcosa che possa supportare tutto e qualsiasi lunghezza... varchar(max).

Quindi, con questi due ostacoli in mente, ecco una soluzione:

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 */

Infine, in buona coscienza non posso raccomandare una soluzione che utilizzi sql dinamico senza preavviso dei pericoli coinvolti in tale (sia dal punto di vista delle prestazioni che del potenziale di iniezione). Leggi questo eccellente articolo se vuoi aumentare le tue conoscenze sull'argomento.

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