我在没有指定约束名称的情况下,使用脚本在我的表上创建了一些约束。因此,我最终得到像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%'
问题在于我们有很多带有这个表的数据库,我需要从这些表中删除所有的约束,但显然每个表的名称都不同。
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);
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%'
在使用Access到SQL Server升级工具后,我遇到了类似的问题。在我的情况下,我需要循环所有表格以匹配约束条件,可以像这样完成:
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);
在SQL Server的后续版本中,您可以避免使用STUFF
方法,请参见this answer了解更多信息。