12

我使用脚本在我的表上创建了一些约束,但没有指定约束名称。结果,我最终受到了限制FK__DOC_OBGS___kntr___54E63309,例如。

是否可以在不指定确切约束名称的情况下删除该约束?

例如,像这样的东西(不起作用)

ALTER TABLE DOC_OBGS_10 DROP CONSTRAINT LIKE 'FK__DOC_OBGS___kntr%'

问题是我们有很多带有这个表的数据库,我需要从表中删除所有约束,但显然每个表的名称都不同。

4

3 回答 3

6

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%'
于 2013-01-19T10:48:46.303 回答
6
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);
于 2013-01-20T09:35:30.827 回答
0

在使用 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 中避免使用该方法,有关更多信息,请参阅此答案

于 2018-03-26T09:39:02.693 回答