根据sql表的值而不是列名删除sql表中的列

时间:2014-09-17 19:49:05

标签: sql sql-server

我有一个临时表,其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

有没有办法做到这一点(我不想创建视图)?

1 个答案:

答案 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
相关问题