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

Dynamic SQL Server Pivot ( UNPIVOT ) kolonnenavn til en rækkeværdi

Så du har et par problemer... det første er, at dette kræver dynamisk sql, fordi tabellen og kolonnerne ikke er kendt på forhånd, så du kan ikke bare bruge en simpel unpivot.

Det betyder også, at du bliver nødt til at hente kolonnenavnene fra systemtabeller.

Dit andet problem er, at alle dine datatyper er ukendte, så du skal støbe alle kolonnerne til noget, der kan understøtte alt og enhver længde... varchar(max).

Så med disse to forhindringer i tankerne er her 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 */

Endelig kan jeg ikke med god samvittighed anbefale en løsning, der bruger dynamisk sql uden advarsel om de farer, der er forbundet med en sådan (både fra et præstationssynspunkt og potentialet for injektion). Læs denne fremragende artikel, hvis du vil øge din viden om emnet.

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




  1. Nogle spørgsmål relateret til SphinxSE og RT indekser

  2. Ajax delete virker ikke i laravel 5.2

  3. CURDATE() Eksempler – MySQL

  4. grails/mysql tidszoneændring