2012-01-18 91 views
4

我正在使用SQL Server。我有一個查詢返回1行數據。動態SQL Server數據透視(UNPIVOT)列名到行值

SELECT * 
FROM DBO.MY_TABLE 
WHERE ID = 5 

它會是這個樣子:

ID F_NAME L_NAME NUMBER 
5  JOE  SCHMOE 1234567890 

我需要一個查詢/程序而轉動他們。我需要的結果是這樣的:

ID  5 
F_NAME JOE 
L_NAME SCHMOE 
NUMBER 1234567890 

基本上而行的值成爲第二列的值列名成爲第一列中的值。

訣竅是,我並不總是知道會有多少列,可能會有2列或20列。它可以變化。

但是隻會有一行數據。

+0

我編輯的問題的標題,因爲轉向列到行是一個「UNPIVOT」不是一個樞軸(轉動一行到一列) – RThomas 2012-01-19 02:46:18

回答

1

所以你有幾個問題......第一個是,這需要動態SQL,因爲表和列未提前知道,所以你不能只使用一個簡單的unpivot。

這也意味着你必須從系統表中獲取列名。

你的第二個問題是你所有的數據類型都是未知的,所以你必須將所有列轉換爲可以支持所有內容和任何長度的東西...... varchar(max)。

所以,在這裏想到這兩個障礙,一個解決方案:

declare @yourTable varchar(50) 
declare @yourKeyField varchar(50) 
declare @yourKey varchar(50) 

set @yourTable = 'MyTable' /** change to tablename or pass as parameter */ 
set @yourKeyField = 'ID' /** change to fieldname or pass as parameter */ 
set @yourKey = '5'   /** change to key value or pass as parameter */ 

declare @query nvarchar(max) 

select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as 
[Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + ' 
where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c 
    inner join sysobjects o on c.id = o.id and o.xtype = 'u' 
    where o.name = @yourTable order by c.colid 

exec sp_executesql @query /** execute query */ 

最後,我不能很好的良心建議使用動態SQL不參與此類危險的警告(得自性能觀點和注入潛力)。如果你想增加你對這個主題的知識,請閱讀這篇優秀的文章。

http://www.sommarskog.se/dynamic_sql.html