动态删除多个外键约束

时间:2014-08-15 22:01:09

标签: sql sql-server constraints

不知道这是怎么发生的,但我们在同一列上有多个相同的FK约束。我认为它们是由一些管理工作室类型的东西命名的,这意味着它们不是默认约束,并且它们不是由人命名的。

我有这个查询来查找约束名称

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Device' 
AND CONSTRAINT_NAME like '%Address%';

如何删除结果集中的每个约束?我想我必须迭代并做一个下拉约束?

3 个答案:

答案 0 :(得分:1)

我能想象的唯一方法就像你说的那样,每次迭代并使用游标(http://msdn.microsoft.com/en-us/library/ms180169.aspx)删除它或编写动态SQL。

答案 1 :(得分:1)

你当然不需要游标或任何类型的循环。只需使用sql来构建你的sql语句。运行以下查询以生成您的sql。然后只需复制并粘贴到新标签页即可。瞧!如果你愿意,这种方法甚至允许你跳过一些。

select 'ALTER TABLE ' + TABLE_NAME + ' DROP CONSTRAINT ' + CONSTRAINT_NAME + ';'
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Device' 
AND CONSTRAINT_NAME like '%Address%';

如果您完全想要自动化它,您可以使用变量来保存结果并执行它。

答案 2 :(得分:1)

试试这个:

Declare @Query Nvarchar(Max)
Declare @name Nvarchar(150)

Declare Cur Cursor For

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Device' 
AND CONSTRAINT_NAME like '%Address%';

Open Cur

Fetch Next From Cur
Into @name

While @@fetch_status=0
Begin

    Set @Query='Alter table Device 
    DROP CONSTRAINT '+Ltrim(Rtrim(@name))

    Execute sp_executesql @Query

    Fetch Next From Cur
    Into @name
End
Close Cur
Deallocate Cur

Go