动态SQL Server数据透视(UNPIVOT)列名到行值

动态SQL Server数据透视(UNPIVOT)列名到行值

问题描述:

我正在使用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

所以你有几个问题......第一个是,这需要动态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