2015-06-01 72 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