sql >> Database >  >> RDS >> Sqlserver

Dynamische SQL Server Pivot (UNPIVOT) kolomnaam naar een rijwaarde

Dus je hebt een paar problemen... de eerste is dat dit dynamische sql vereist omdat de tabel en kolommen niet van tevoren bekend zijn, dus je kunt niet gewoon een simpele unpivot gebruiken.

Dat betekent ook dat je de kolomnamen uit systeemtabellen moet halen.

Je tweede probleem is dat al je datatypes onbekend zijn, dus je moet alle kolommen casten naar iets dat alles en elke lengte kan ondersteunen... varchar(max).

Dus met die twee obstakels in gedachten is hier een oplossing:

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

Ten slotte kan ik met een goed geweten geen oplossing aanbevelen die dynamische sql gebruikt zonder te waarschuwen voor de gevaren die daaraan verbonden zijn (zowel vanuit het oogpunt van prestaties als het potentieel voor injectie). Lees dit uitstekende artikel als u uw kennis over dit onderwerp wilt vergroten.

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




  1. Hoe de taal (Engels, Chinees...) van een bepaalde string in Oracle te bepalen?

  2. Documenten uploaden naar Azure Data Lake en gegevens exporteren met SSIS

  3. Is het mogelijk om komma's in plaats van punten voor decimale velden op te slaan in een PostgreSQL-database?

  4. Kan een DB niet verbinden met AWS