将记录的每一列转换为单独的记录

时间:2015-06-01 13:29:30

标签: sql sql-server database tsql

我有一个记录:

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

此查询中的问题是我必须明确定义列,是否应该动态获取列名称及其值?

2 个答案:

答案 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。在真正的桌子上这有点麻烦。但是,对于表变量或临时表,您还有额外的范围规则问题 - 执行语句时表的名称将不在范围内。