Dans SQL Server, existe-t-il un moyen de renvoyer une seule ligne de données sous la forme d'une table à deux colonnes?

J'ai une requête qui renvoie une seule ligne de données. Disons qu'il ressemble à ceci (avec les en-têtes de colonne).

Fruit | Veg | Meats | Nuts | ---------------------------------------- Apple Lettuce Veal Almond 

Au lieu de cela, je voudrais returnner cette seule ligne comme une table à deux colonnes, avec le nom de colonne / champ dans la colonne la plus à gauche. Ainsi:

 FieldName | Value | ----------------------- Fruit Apple Veg Lettuce Meats Veal Nuts Almond 

On dirait qu'il devrait y avoir une façon non douloureuse d'y arriver, mais s'il y en a, je n'arrive pas à le find. Frapper un mur de briques. Est-ce seulement possible?

Merci beaucoup pour toute consortingbution.

EDIT: La requête renvoie des résultats qui ne sont pas statiques, donc je ne serai pas en mesure de définir explicitement les en-têtes de colonne.

EDIT 2: J'essaie de faire fonctionner certaines de ces suggestions, mais je n'arrive toujours pas à faire fonctionner cela avec plus d'une colonne. Voici mon code:

 SELECT TOP 10 FieldName, CAST(FieldValue as varchar(MAX)) As FieldValue FROM Meter M UNPIVOT([FieldValue] FOR FieldName IN ([MeterName],[MID])) UP WHERE ClientNumber = 12300 

Chaque fois, j'obtiens l'erreur "Msg 8167, niveau 16, état 1, ligne 4 Le type de colonne" MID "est en conflit avec le type d'autres colonnes spécifiées dans la list UNPIVOT."

J'ai regardé ceci, et il semble être un problème lié aux types / longueur de colonne, et peu importe comment je lance le FieldValue, même erreur. Des pensées là-bas?

EDIT 3: Résolution du conflit de colonnes …

Les résultats d'incantation de la table d'origine ne fonctionneraient PAS, donc j'ai dû utiliser une table dérivée et les lancer pour que les colonnes renvoyées au PIVOT soient du même type. Bizarre, mais la seule solution que je pourrais find serait la suivante.

 SELECT FieldName, CAST(FieldValue as varchar(MAX)) As FieldValue, FROM ( /* Derived table so that we can control the column types for everything selected, because PIVOT demands that every pivoted column be of the same data type and length. */ SELECT TOP 1 CAST(M.MeterName as varchar(MAX)) As MeterName, CAST(M.MID as varchar(MAX)) As MID, CAST(D.DeviceType as varchar(MAX)) As DeviceType FROM Meter M INNER JOIN CurrentDevice D ON D.ClientNumber = M.ClientNumber AND D.MID = M.MID WHERE M.ClientNumber = 12300 ) T UNPIVOT([FieldValue] FOR FieldName IN ([MeterName],[MID],[DeviceType])) UP 

Pour SQL Server 2005+, vous pouvez utiliser UNPIVOT :

 SELECT FieldName, Value FROM YourTable T UNPIVOT([Value] FOR FieldName IN (Fruit, Veg, Meats, Nuts)) UP 

Voici un Fiddle SQL pour vous d'essayer.

Mis à jour pour la nouvelle exigence

Ok, vous avez besoin de SQL dynamic si vous ne connaissez pas les colonnes de votre table. D'abord, allez sur ce lien . Ensuite, vous pouvez essayer le follwing:

 DECLARE @Fields NVARCHAR(MAX), @Sql NVARCHAR(MAX) SELECT @Fields = STUFF((SELECT DISTINCT ',' + QUOTENAME(Name) FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('YourTable') FOR XML PATH('')),1,1,'') SET @Sql = ' SELECT FieldName, Value FROM YourTable T UNPIVOT([Value] FOR FieldName IN ('+@Fields+')) UP ' EXEC sp_executesql @sql 

vous pouvez utiliser la requête UNPIVOT dynamic

 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT ','+ QUOTENAME( name) from sys.columns where object_id= object_id('your_table') FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'select FieldName, Value FROM your_table T UNPIVOT([Value] FOR FieldName IN ('+@cols+')) P' exec(@query) 

Démo de Fiddle SQL

Vous pouvez utiliser PIVOT pour cela: http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx .