不知道这是怎么发生的,但我们在同一列上有多个相同的FK约束。我认为它们是由一些管理工作室类型的东西命名的,这意味着它们不是默认约束,并且它们不是由人命名的。
我有这个查询来查找约束名称
SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Device'
AND CONSTRAINT_NAME like '%Address%';
如何删除结果集中的每个约束?我想我必须迭代并做一个下拉约束?
答案 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