我有一个记录:
DECLARE @Tbl AS TABLE(Col1 VARCHAR(10), Col2 VARCHAR(10), Col3 VARCHAR(10));
INSERT INTO @Tbl
VALUES('Val1', 'Val2', 'Val3')
-- Source Record
SELECT Col1, Col2, Col3 FROM @Tbl
结果:Val1 Val2 Val3
我希望每列的结果作为单独的两列记录,如第一列将成为源列的标题,第二列应该是源列的值,如下面查询的结果,其中我已通过{{获得结果1}}:
UNION ALL
此查询中的问题是我必须明确定义列,是否应该动态获取列名称及其值?
答案 0 :(得分:2)
您可以使用UNPIVOT
,但仍需要知道列的名称。
SELECT ColumnName, ValueName
FROM (SELECT * FROM @Tbl) AS Data
UNPIVOT
( ValueName
FOR ColumnName IN (Col1, Col2, Col3)
) AS PivottedOutput
答案 1 :(得分:1)
我喜欢在SQL Server中进行非透明的apply
方法:
select v.*
from @tbl t cross apply
(values ('col1', col1),
('col2', col2),
('col3', col3)
) v(AttributeTitle, AttributeValue);
这简化了查询,但它没有直接回答问题。
如果您想要可变数量的列,那么您将不得不使用动态SQL。在真正的桌子上这有点麻烦。但是,对于表变量或临时表,您还有额外的范围规则问题 - 执行语句时表的名称将不在范围内。