加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 动态SQL Server Pivot(UNPIVOT)列名称为行值

发布时间:2020-12-12 16:21:52 所属栏目:MsSql教程 来源:网络整理
导读:我正在使用SQL Server.我有一个返回1行数据的查询. SELECT *FROM DBO.MY_TABLEWHERE ID = 5 它看起来像这样: ID F_NAME L_NAME NUMBER5 JOE SCHMOE 1234567890 我需要一个支持它们的查询/程序.我需要结果看起来像这样: ID 5F_NAME JOEL_NAME SCHMOENUMBER 1
我正在使用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的解决方案,而不会警告所涉及的危险(从性能角度和注入的可能性).如果您想增加对该主题的了解,请阅读这篇优秀文章.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读