【问题标题】:SQL Unpivot With Every ColumnSQL Unpivot 与每一列
【发布时间】:2014-10-13 21:58:05
【问题描述】:

我有以下查询,它适用于所选的 4 列,但问题是我需要选择表的每一列(大约有 50 列)。有没有更简单的方法来代替 SELECT 和 IN 语句中的 50 列中的每一列。我也意识到可能存在数据类型问题。仅返回 1 行数据。

SELECT g.property, 
   g.value 
FROM   (SELECT applicationversion, 
           ftpservername, 
           smtpservername, 
           Cast(numberofservers AS NVARCHAR(max)) AS numberofservers 
    FROM   globals) Person 
   UNPIVOT (value 
           FOR property IN (applicationversion, 
                            ftpservername, 
                            smtpservername, 
                            numberofservers)) AS g; 

【问题讨论】:

  • 检查this 问题。你正在使用STATIC UNPIVOT 你需要DYNAMIC UNPIVOT

标签: sql tsql multiple-columns unpivot


【解决方案1】:

请试试这个:

DECLARE @sql AS NVARCHAR(MAX)
DECLARE @cols1 AS NVARCHAR(MAX)
DECLARE @cols2 AS NVARCHAR(MAX)

SELECT @cols1= ISNULL(@cols1 + ',','') + QUOTENAME(name)
FROM (select c.name from sys.tables t
inner join sys.columns c on c.object_id = t.object_id
where t.name = 'globals'
 ) cols1

SELECT @cols2= ISNULL(@cols2 + ',cast(','cast(') + QUOTENAME(name) + ' as nvarchar(max))'+ QUOTENAME(name) 
FROM (select c.name from sys.tables t
inner join sys.columns c on c.object_id = t.object_id
where t.name = 'globals'
 ) cols2


SET @sql =
  N'SELECT g.property, g.value  
FROM   (SELECT ' + @cols2 + '  
    FROM  globals) Person 
   UNPIVOT (value 
           FOR property IN (' + @cols1 +')) AS g; '

EXEC sp_executesql @sql

它并不漂亮,当然可以改进,但它应该可以工作。

【讨论】:

  • 非常感谢,效果很好。我有点虽然它需要动态 SQL,但我不确定某些查询语言。
【解决方案2】:

对 jpw 的版本略有改进

DECLARE @sql AS NVARCHAR(MAX)
DECLARE @cols1 AS NVARCHAR(MAX)
DECLARE @cols2 AS NVARCHAR(MAX)

SELECT @cols1= ISNULL(@cols1 + ',','') + QUOTENAME(name), @cols2= ISNULL(@cols2 + ',cast(','cast(') + QUOTENAME(name) + ' as nvarchar(max))'+ QUOTENAME(name) 
FROM (select c.name from sys.tables t
inner join sys.columns c on c.object_id = t.object_id
where t.name = 'globals'
 ) cols1


SET @sql =
  N'SELECT g.property, g.value  
FROM   (SELECT ' + @cols2 + '  
    FROM  globals) Person 
   UNPIVOT (value 
           FOR property IN (' + @cols1 +')) AS g; '

EXEC sp_executesql @sql

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多