在SQL Server中,有没有办法将单行数据作为2列表返回?

Duc*_*ain 2 sql-server

我有一个返回单行数据的查询.让我们说它看起来像这样(带有列标题).

Fruit    | Veg     | Meats   | Nuts    |
----------------------------------------
Apple      Lettuce   Veal      Almond
Run Code Online (Sandbox Code Playgroud)

而不是这个,我想将这一行作为两列表返回,列/字段名称在最左边的列中.像这样:

FieldName  | Value    |
-----------------------
Fruit        Apple
Veg          Lettuce
Meats        Veal
Nuts         Almond
Run Code Online (Sandbox Code Playgroud)

似乎应该有一些非痛苦的方法来实现这一点,但如果有,我似乎无法找到它.打砖墙.这甚至可能吗?

非常感谢任何输入.

编辑: 查询返回非静态的结果,因此我将无法显式定义列标题.

编辑2: 我试图让其中一些建议起作用,但仍然无法使用多列来实现这一功能.这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

每次,我都会收到错误"消息8167,级别16,状态1,行4"列的类型"MID"与UNPIVOT列表中指定的其他列的类型冲突."

我看了这个,它似乎是一个与列类型/长度相关的问题,无论我如何投射FieldValue,都是同样的错误.有什么想法?

编辑3:列冲突的解决方案......

原始表的转换结果不起作用,因此我必须使用派生表并在那里进行转换,以便返回到PIVOT的列都是相同的数据类型.奇怪,但我能找到的唯一解决办法就是运行.

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
Run Code Online (Sandbox Code Playgroud)

Lam*_*mak 8

对于SQL Server 2005+,您可以使用UNPIVOT:

SELECT FieldName, Value
FROM YourTable T
UNPIVOT([Value] FOR FieldName IN (Fruit, Veg, Meats, Nuts)) UP
Run Code Online (Sandbox Code Playgroud)

这是一个SQL小提琴,你可以试试.

更新了新要求

好的,如果您不知道表的列,则需要动态SQL.首先,转到此链接.然后你可以尝试下面的内容:

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
Run Code Online (Sandbox Code Playgroud)