我有一个包含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个列名称更简单的方法。
提前致谢。
答案 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
,以确保动态查询是您所追求的。