sql >> Databasteknik >  >> RDS >> Sqlserver

Dynamic SQL Server Pivot ( UNPIVOT ) kolumnnamn till ett radvärde

Så du har ett par problem... det första är att detta kräver dynamisk sql eftersom tabellen och kolumnerna inte är kända i förväg så du kan inte bara använda en enkel unpivot.

Det betyder också att du måste hämta kolumnnamnen från systemtabeller.

Ditt andra problem är att alla dina datatyper är okända så du måste gjuta alla kolumner till något som kan stödja allt och vilken längd som helst... varchar(max).

Så med dessa två hinder i åtanke är här en lösning:

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

Slutligen kan jag inte med gott samvete rekommendera en lösning som använder dynamisk sql utan att varna för farorna med en sådan (både ur prestandasynpunkt och potential för injektion). Läs denna utmärkta artikel om du vill öka dina kunskaper i ämnet.

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




  1. Konfigurera PDO-anslutning utan lösenord

  2. Oracle Wait-händelser som alla borde känna till

  3. SQL Server String Sammansättning med Null

  4. Ta bort ett databaspostkonto (SSMS)