取消隐藏SQL表中的所有列

use*_*843 2 sql sql-server unpivot sql-server-2008-r2

我有一个包含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
Run Code Online (Sandbox Code Playgroud)

这是我的数据的来源:

Column_Name1    Column_Name2    Column_Name3
Value11         Value21         Value31
Value12         Value22         Value32
Value13         Value23         Value33
Run Code Online (Sandbox Code Playgroud)

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

New_Column1    New_cloumn2
Column_Name1   Value11
Column_Name1   Value12
Column_Name1   Value13
Column_Name2   Value21
...
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Har*_* CO 7

这似乎是一个破碎的数据模型,但您可以避免键入列的列表.

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

SELECT name
FROM sys.columns
WHERE objecT_id = OBJECT_ID('Test_Data')
Run Code Online (Sandbox Code Playgroud)

和:

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以在动态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)  
Run Code Online (Sandbox Code Playgroud)

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