我使用脚本在我的表上创建了一些约束,但没有指定约束名称。结果,我最终受到了限制FK__DOC_OBGS___kntr___54E63309
,例如。
是否可以在不指定确切约束名称的情况下删除该约束?
例如,像这样的东西(不起作用)
ALTER TABLE DOC_OBGS_10 DROP CONSTRAINT LIKE 'FK__DOC_OBGS___kntr%'
问题是我们有很多带有这个表的数据库,我需要从表中删除所有约束,但显然每个表的名称都不同。
我使用脚本在我的表上创建了一些约束,但没有指定约束名称。结果,我最终受到了限制FK__DOC_OBGS___kntr___54E63309
,例如。
是否可以在不指定确切约束名称的情况下删除该约束?
例如,像这样的东西(不起作用)
ALTER TABLE DOC_OBGS_10 DROP CONSTRAINT LIKE 'FK__DOC_OBGS___kntr%'
问题是我们有很多带有这个表的数据库,我需要从表中删除所有约束,但显然每个表的名称都不同。
SQL 中的 DDL 命令不与 like 运算符配合使用。
但是,您可以使用 information_schema 视图并轻松地为删除约束命令构建 SQL,如下所示:
SELECT 'ALTER TABLE DOC_OBGS_10 DROP CONSTRAINT ' + CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_NAME LIKE 'FK__DOC_OBGS___kntr%'
DECLARE @sql1 NVARCHAR(MAX);
SELECT @sql1 = c
FROM
(
SELECT 'ALTER TABLE DOC_INVS_1 DROP CONSTRAINT ' + CONSTRAINT_NAME + '; '
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'DOC_INVS_1'
and CONSTRAINT_NAME LIKE 'FK__DOC_INVS___kntr%'
) T(c);
EXEC(@sql1);
在使用 Access to SQL Server upizing tool 后,我遇到了类似的问题。在我的情况下,我需要循环所有表以匹配约束,可以这样完成:
DECLARE @sql1 NVARCHAR(MAX);
-- Concatenate all the drop statements in the inner loop into a single SQL string
SELECT @sql1 = STUFF((SELECT '; ' + a.t FROM
(
-- find all the constraints we're interested in and create a list of
-- SQL statements to drop them
SELECT 'ALTER TABLE [' + p.name + '] DROP CONSTRAINT [' + o.name + ']' as t
FROM sys.objects o
left join sys.objects p on o.parent_object_id = p.object_id
WHERE o.name LIKE '%disallow_zero_length'
) a
FOR XML PATH('')), 1, 2, '')
print @sql1
-- Execute the bit concatenated drop statement
EXEC(@sql1);
STUFF
您可以在更高版本的 SQL Server 中避免使用该方法,有关更多信息,请参阅此答案。