使用column_name函数取消激活表

时间:2014-07-30 08:57:49

标签: sql sql-server pivot unpivot

我有一个表被设计为具有与我需要引用它的值相同的列。我知道如果我手动输入所有列名称,我需要取消对表的设置并使其工作,但是这个表不断添加新列,因此我想捕获unpivot中的所有列而不是手动编写脚本。 / p>

我可以使用column_name函数获取列名,并且想知道是否可以将它添加到unpivot中,我一直在玩它并且它现在看起来不可能,所以想到id检查看看是否还有其他建议。

可悲的是,我无法重新设计表格,以及列名称的添加位置,尽管这将是理想的解决方案。

select Day, Rota, RotaTemplate
from table1 t1
unpivot
(
  Rota
  for RotaTemplate in (select Column_name
                        from INFORMATION_SCHEMA.COLUMNS
                        where TABLE_NAME = 'table1')
) unpiv;

1 个答案:

答案 0 :(得分:0)

您不能这样做。您需要构建动态SQL语句,如下所示:

DECLARE @DynamicSQL NVARCHAR(MAX)

SET @DynamicSQL = N'select Day, Rota, RotaTemplate' + CHAR(10) + 
                 'from table1 t1'+ CHAR(10) + 
                 'unpivot' + CHAR(10) + 
                 '(' + CHAR(10) + CHAR(9) + 
                    'Rota for RotaTemplate in (' 
                    +  
                     STUFF
                    (
                        (
                            SELECT ',[' + [COLUMN_NAME] + '] '
                            FROM [INFORMATION_SCHEMA].[COLUMNS]
                            WHERE [TABLE_NAME] = 'table1'
                            FOR XML PATH('')
                        )
                        ,1
                        ,1
                        ,''
                    )
                    +')'  + CHAR(10) +
                 ') unpiv;'

EXEC sp_executesql @DynamicSQL