如何从 SQL 服务器中的所有表中删除列
How to delete column from all tables in 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)
但是我收到一个错误
incorrect syntax near column
如何操作?
这不是从 table 中删除列的正确方法。应该是
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
您可以使用 SQL 服务器 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]'
从多个表中删除列时,我遇到了以下默认约束错误。
The object 'DF_TableName_ColumnName' is dependent on column '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
我发帖在这里以防有人发现同样的问题。
编码愉快!
我想从我的数据库的所有表中删除 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)
但是我收到一个错误
incorrect syntax near column
如何操作?
这不是从 table 中删除列的正确方法。应该是
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
您可以使用 SQL 服务器 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]'
从多个表中删除列时,我遇到了以下默认约束错误。
The object 'DF_TableName_ColumnName' is dependent on column '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
我发帖在这里以防有人发现同样的问题。
编码愉快!