Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamic SQL Server Pivot ( UNPIVOT )-Spaltenname zu einem Zeilenwert

Sie haben also ein paar Probleme ... das erste ist, dass dies dynamisches SQL erfordert, da die Tabelle und die Spalten nicht im Voraus bekannt sind, sodass Sie nicht einfach ein einfaches Unpivot verwenden können.

Das bedeutet auch, dass Sie die Spaltennamen aus Systemtabellen holen müssen.

Ihr zweites Problem ist, dass alle Ihre Datentypen unbekannt sind, also müssen Sie alle Spalten in etwas umwandeln, das alles und jede Länge unterstützen kann ... varchar(max).

Also, mit diesen beiden Hindernissen im Hinterkopf, hier ist eine Lösung:

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

Schließlich kann ich nicht guten Gewissens eine Lösung empfehlen, die dynamisches SQL verwendet, ohne vor den damit verbundenen Gefahren zu warnen (sowohl vom Leistungsstandpunkt als auch vom Potenzial für Injektionen). Lesen Sie diesen hervorragenden Artikel, wenn Sie Ihr Wissen zu diesem Thema erweitern möchten.

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