我正在使用sql Server.我有一个返回1行数据的查询.
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列.它可以变化.
但是只有一行数据.
解决方法
所以你有几个问题……首先,这需要动态的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的解决方案,而不会警告所涉及的危险(从性能角度和注入的可能性).如果您想增加对该主题的了解,请阅读这篇优秀文章.