2015-06-01 32 views
3

我有一个纪录:转换记录的每一列到单独的记录

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

我想每列作为单独的两列的记录,如第一列将成为结果源列和第二列的标题应源列的像在我所通过UNION ALL获得的结果如下查询的结果的值:

--Query for Target Result 
SELECT 'Col1' AttributeTitle, CONVERT(VARCHAR, Col1) AttributeValue FROM @Tbl 
UNION ALL SELECT 'Col2' AttributeTitle, CONVERT(VARCHAR, Col2) AttributeValue FROM @Tbl 
UNION ALL SELECT 'Col3' AttributeTitle, CONVERT(VARCHAR, Col3) AttributeValue FROM @Tbl 

这个查询中的问题是我必须明确定义列,有没有什么方法可以动态地获取列名和它们的值?

+0

有没有简单的方法。您可以使用模式视图来编写动态sql。或者可能是一个UNPIVOT。 –

+0

请让我知道如何使用模式视图为此目的编写动态SQL? – Shehzad

回答

1

我喜欢apply法在SQL Server unpivoting:

select v.* 
from @tbl t cross apply 
    (values ('col1', col1), 
      ('col2', col2), 
      ('col3', col3) 
    ) v(AttributeTitle, AttributeValue); 

这简化了查询,但它并没有直接回答这个问题。

如果您想要可变数量的列,那么您将不得不使用动态SQL。这在真正的桌子上有点麻烦。但是,对于表变量或临时表,您有额外的范围规则问题 - 执行语句时,表的名称将不在范围内。

+0

请让我知道如何为此写入动态SQL? – Shehzad

2

您可以使用UNPIVOT但您仍然需要知道列的名称。

SELECT ColumnName, ValueName 
FROM (SELECT * FROM @Tbl) AS Data 
UNPIVOT 
( ValueName 
    FOR ColumnName IN (Col1, Col2, Col3) 
) AS PivottedOutput 
+0

感谢David,但我的问题是: “它应该动态获取列名称及其值?” – Shehzad

+0

这是一个临时表还是真正的表? – DavidG

+0

它既可以是实际表格,也可以是用户定义表格类型的变量。 – Shehzad