我有一个临时表,其column_names是动态创建的,值来自XML,但有些列有NULL值,我想从表中删除它们。 命令:
ALTER TABLE ##temptable
DROP COLUMN COLUMN_NAME
如果我知道column_name,工作正常,但由于column_names是动态创建的,我不会知道它们。例如:
animal | human | things | stars | cars
5 | name | null | bright | null
所以动态创建的列'东西'和'汽车'需要被删除,所以看起来像这样:
animal | human | stars
5 | name | bright
有没有办法做到这一点(我不想创建视图)?
答案 0 :(得分:1)
您可以使用以下内容。当然,您应该添加更多验证,以确保它不会失败。
create table #tmp (user_id int, col1 int, col2 int)
declare @column_to_drop nvarchar(100) = 'col1'
declare @sql nvarchar(max) = 'ALTER TABLE #tmp DROP COLUMN ' + QUOTENAME(@column_to_drop)
exec sp_executesql @sql
select * from #tmp
祝你好运。
LATER EDIT:
你可以试试这个。唯一需要知道的是临时表名。
CREATE TABLE #tmp (a nvarchar(max), b nvarchar(10), c nvarchar(100), d nvarchar(1000), e datetime, f int)
INSERT #tmp VALUES ('1', null, '2', null, GETDATE(), null)
SELECT *
FROM #tmp
SELECT name, CAST(0 AS BIT) checked
INTO #col_names
FROM tempdb.sys.columns
WHERE object_id = OBJECT_ID('tempdb..#tmp')
DELETE C
FROM ( SELECT *
FROM #tmp
FOR XML PATH(''), TYPE) AS T(XMLCol)
CROSS APPLY T.XMLCol.nodes('*') AS n(Col)
INNER JOIN #col_names C
ON c.name = Col.value('local-name(.)', 'varchar(max)')
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = COALESCE(@sql + ', ' + QUOTENAME(name), QUOTENAME(name))
FROM #col_names
SET @sql = 'ALTER TABLE #tmp DROP COLUMN ' + @sql
PRINT @sql
EXEC (@sql)
SELECT *
FROM #tmp
DROP TABLE #tmp
DROP TABLE #col_names