取消隐藏SQL表中的所有列

时间:2014-02-24 19:23:02

标签: sql sql-server sql-server-2008-r2 unpivot

我有一个包含30列的表格,我想轻松地取消所有列的删除。我知道我可以使用这个策略:

SELECT col, value 
INTO New_Table
FROM
(SELECT * FROM Test_Data) p
UNPIVOT
(value FOR col IN (Column_Name1, Column_Name2... Column_Name30)) as unpvt

这就是我的数据输入方式:

Column_Name1    Column_Name2    Column_Name3
Value11         Value21         Value31
Value12         Value22         Value32
Value13         Value23         Value33

这就是我想将它存储在新表中的方式:

New_Column1    New_cloumn2
Column_Name1   Value11
Column_Name1   Value12
Column_Name1   Value13
Column_Name2   Value21
...

但是必须有一种比输入30个列名称更简单的方法。

提前致谢。

1 个答案:

答案 0 :(得分:6)

这看起来像是一个破碎的数据模型,但你可以避免输入列的列表。

您可以使用它来生成列列表:

SELECT name
FROM sys.columns
WHERE objecT_id = OBJECT_ID('Test_Data')

DECLARE @List VARCHAR(MAX) = STUFF((SELECT DISTINCT ',' +   QUOTENAME(name)                     
                                    FROM sys.columns
                                    WHERE objecT_id = OBJECT_ID('Test_Data')                                    
                                    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
                                    ,1,1,'')
PRINT @List

然后,您可以在动态sql语句中使用该列表:

DECLARE @List VARCHAR(MAX) = STUFF((SELECT DISTINCT ',' +   QUOTENAME(name)                     
                                    FROM sys.columns
                                    WHERE objecT_id = OBJECT_ID('Test_Data')                                    
                                    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
                                    ,1,1,'')
        ,@sql VARCHAR(MAX)
SET  @sql  =  'SELECT  col,value  
               INTO New_Table
               FROM  (SELECT  *  FROM  Test_Data)  p
               UNPIVOT (value  FOR  col  IN  ('+@List+'))  as  unpvt
              '
EXEC  (@sql)  

我建议您在使用PRINT (@sql)之前使用EXEC,以确保动态查询是您所追求的。