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

J'utilise SQL Server. J'ai une requête qui renvoie 1 ligne de données.

SELECT * FROM DBO.MY_TABLE WHERE ID = 5 

Cela ressemblera à ceci:

 ID F_NAME L_NAME NUMBER 5 JOE SCHMOE 1234567890 

J'ai besoin d'une requête / procédure qui les pivote. J'ai besoin que le résultat ressemble à ceci:

 ID 5 F_NAME JOE L_NAME SCHMOE NUMBER 1234567890 

Fondamentalement, le nom de la colonne devient la valeur dans la première colonne tandis que la valeur de la ligne devient la valeur de la deuxième colonne.

L'astuce est que je ne sais pas toujours avec certitude combien de colonnes il y aura, il pourrait y avoir 2 ou 20 colonnes. Cela peut varier.

Cependant, il n'y aura qu'une seule ligne de données.

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

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

Votre deuxième problème est que tous vos types de données sont inconnus, donc vous devez convertir toutes les colonnes en quelque chose qui peut supporter tout 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, reorder une solution qui utilise le SQL dynamic sans prévenir des dangers qui y sont associés (tant du sharepoint vue des performances que du potentiel d'injection). Lisez cet excellent article si vous voulez approfondir vos connaissances sur le sujet.

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