删除一个SQLTable列给出Constraint dependency error
Delete a SQL Table Column give Constraint dependency error
我尝试在 SQL 中删除一列,但出现此错误:
The object 'DF__...'is dependent on column ...
我发现了很多需要先删除约束的解决方案,所以我 运行 这个并成功了:
ALTER TABLE [dbo].[Configuration] DROP CONSTRAINT DF__SiteConfi__Na__2DFCAC08;
ALTER TABLE [dbo].[Configuration] DROP COLUMN NaFlag;
但是我需要这个脚本在任何服务器上 运行,所以我不想提及约束名称,因为它在任何其他服务器上可能不同。什么是最好的解决方案?
这是一个帮助您入门的查询:
with q as
(
select schema_name(t.schema_id) schema_name,
t.name table_name,
c.name column_name,
d.name default_name
from sys.tables t
join sys.columns c
on t.object_id = c.object_id
join sys.default_constraints d
on d.parent_object_id = t.object_id
and d.parent_column_id = c.column_id
)
select concat(
'alter table ',
quotename(schema_name),'.',quotename(table_name),
' drop constraint ', quotename(default_name) ) sql
from q
您可以使用一些动态 SQL 来删除默认值。如果它是一个单独的脚本来删除列,那么它更容易,比如:
DECLARE @sqlDF NVARCHAR(MAX);
SELECT @sqlDF = 'ALTER TABLE {$tableName} DROP CONSTRAINT ' + QUOTENAME(OBJECT_NAME([default_object_id])) + ';'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('{$tableName}') AND [name] in ({$columns}) AND [default_object_id] <> 0;
IF @sqlDF IS NOT NULL
EXEC(@sqlDF);
如果您正在使用迁移工具,也许您将不得不重构它,因此它不会尝试重新声明 @sqlDF
变量。
我尝试在 SQL 中删除一列,但出现此错误:
The object 'DF__...'is dependent on column ...
我发现了很多需要先删除约束的解决方案,所以我 运行 这个并成功了:
ALTER TABLE [dbo].[Configuration] DROP CONSTRAINT DF__SiteConfi__Na__2DFCAC08;
ALTER TABLE [dbo].[Configuration] DROP COLUMN NaFlag;
但是我需要这个脚本在任何服务器上 运行,所以我不想提及约束名称,因为它在任何其他服务器上可能不同。什么是最好的解决方案?
这是一个帮助您入门的查询:
with q as
(
select schema_name(t.schema_id) schema_name,
t.name table_name,
c.name column_name,
d.name default_name
from sys.tables t
join sys.columns c
on t.object_id = c.object_id
join sys.default_constraints d
on d.parent_object_id = t.object_id
and d.parent_column_id = c.column_id
)
select concat(
'alter table ',
quotename(schema_name),'.',quotename(table_name),
' drop constraint ', quotename(default_name) ) sql
from q
您可以使用一些动态 SQL 来删除默认值。如果它是一个单独的脚本来删除列,那么它更容易,比如:
DECLARE @sqlDF NVARCHAR(MAX);
SELECT @sqlDF = 'ALTER TABLE {$tableName} DROP CONSTRAINT ' + QUOTENAME(OBJECT_NAME([default_object_id])) + ';'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('{$tableName}') AND [name] in ({$columns}) AND [default_object_id] <> 0;
IF @sqlDF IS NOT NULL
EXEC(@sqlDF);
如果您正在使用迁移工具,也许您将不得不重构它,因此它不会尝试重新声明 @sqlDF
变量。