Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Nom de colonne Dynamic SQL Server Pivot ( UNPIVOT ) à une valeur de ligne

Vous avez donc quelques problèmes... le premier est que cela nécessite SQL dynamique car la table et les colonnes ne sont pas connues à l'avance, vous ne pouvez donc pas simplement utiliser un simple pivot.

Cela signifie également que vous devrez obtenir les noms de colonne à partir des tables système.

Votre deuxième problème est que tous vos types de données sont inconnus, vous devez donc convertir toutes les colonnes en quelque chose qui peut tout supporter et n'importe quelle longueur... varchar(max).

Donc, avec ces deux obstacles à l'esprit, voici une solution :

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

Enfin, je ne peux pas en toute bonne conscience recommander une solution qui utilise SQL dynamique sans avertir des dangers qu'elle implique (tant du point de vue des performances que du potentiel d'injection). Lisez cet excellent article si vous souhaitez approfondir vos connaissances sur le sujet.

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