Unpivot ALL Columns in a SQL Table

瘦欲@ 提交于 2019-12-01 10:54:55

This seems like a broken data model, but you can avoid typing out lists of columns.

You can use this to generate a list of columns:

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

And:

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

You can then use that list in a dynamic sql statement:

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)  

I suggest using PRINT (@sql) before using EXEC to ensure the dynamic query is what you were after.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!