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列名称更简单的方法.
提前致谢.
这似乎是一个破碎的数据模型,但您可以避免键入列的列表.
您可以使用它来生成列列表:
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
以确保动态查询是你所追求的.