如何从SQL Server中的所有表中删除列

时间:2015-01-03 07:51:24

标签: sql-server

我想从数据库的所有表中删除ABCDEF列。我正在尝试这段代码:

declare @SQL nvarchar(max)  

SELECT 
    @SQL = STUFF((SELECT ' DROP column ' + quotename(TABLE_SCHEMA) + '.' + quotename(table_NAME ) +'.ABCDEF;'
FROM
    information_schema.columns 
FOR XML PATH('')),1,2,'')

PRINT @SQL

EXECUTE (@SQL)

但我收到错误

  

附近的语法不正确

怎么做?

3 个答案:

答案 0 :(得分:6)

您可以使用SQL Server sys.sp_msforeachtable的未记录的功能。下面的脚本将基本上迭代数据库中的所有表,并在需要时alter

select '[dbo].['+tab.name+']' name into #table from 
sys.tables tab join sys.columns col on tab.object_id = col.object_id and col.name = 'ABCDEF'

exec sys.sp_msforeachtable 'if exists (select 1 from #table where name = ''?'') 
alter table ?  drop column [ABCDEF]'

答案 1 :(得分:3)

这不是从表中删除列的正确方法。它应该是

ALTER TABLE table_name DROP COLUMN column_name

建立你的dynamic query这样的东西:

DECLARE @sql NVARCHAR(max)=''

SELECT @SQL += 'Alter table ' + Quotename(table_catalog)
               + '.' + Quotename(table_schema) + '.'
               + Quotename(TABLE_NAME) + '  DROP column '
               + Quotename(column_name) + ';'
FROM   information_schema.columns where COLUMN_NAME = 'abcd' -- Here alone mention 
                                                             --the Column to be removed

EXEC Sp_executesql @sql 

答案 2 :(得分:0)

从多个表中删除列时,我遇到了以下默认约束错误。

对象“ DF_TableName_ColumnName”取决于列“ ColumnName”。

要解决此问题,我必须先使用以下查询删除所有这些约束

DECLARE @sql NVARCHAR(max)=''     
SELECT @SQL += 'Alter table ' + Quotename(tbl.name) + '  DROP constraint ' + Quotename(cons.name) + ';'
 FROM SYS.DEFAULT_CONSTRAINTS cons 
 JOIN   SYS.COLUMNS col ON col.default_object_id = cons.object_id
 JOIN   SYS.TABLES tbl ON tbl.object_id = col.object_id
 WHERE  col.[name] IN ('Column1','Column2')

--PRINT @sql
EXEC Sp_executesql @sql 

之后,我使用上面的答案删除了所有这些列。

DECLARE @sql NVARCHAR(max)='' 
SELECT @SQL += 'Alter table ' + Quotename(table_catalog)+ '.' + Quotename(table_schema) + '.'+ Quotename(TABLE_NAME) 
               + '  DROP column ' + Quotename(column_name) + ';'
FROM   information_schema.columns where COLUMN_NAME IN ('Column1','Column2')  
--PRINT @sql
EXEC Sp_executesql @sql 

如果有人发现相同的问题,我会在这里发布。

快乐编码!