我希望放弃我所拥有的桌子的所有限制。 由于这在SQL Server中是不可能的,因此我创建了一个脚本(基于在线发现的内容),该脚本通过选择动态创建drop语句:
SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']'
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
AND TABLE_NAME LIKE 'Old_%''
这样做了,我找不到如何解析它并在循环中执行它。
我的尝试是创建一个这样的游标,但我不知道如何让它执行每一行:
DECLARE @AlterTables nvarchar(2000)
SET @AlterTables = 'DECLARE Dyn_cursor CURSOR
FOR SELECT ''ALTER TABLE '' + TABLE_SCHEMA + ''.['' + TABLE_NAME + ''] DROP CONSTRAINT ['' + CONSTRAINT_NAME + '']''
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = ''FOREIGN KEY''
AND TABLE_NAME LIKE ''Old_%'''
Exec(@AlterTables)
Open Dyn_Cursor
FETCH NEXT FROM Dyn_Cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
END
Close Dyn_cursor
Deallocate Dyn_cursor
提前感谢您为此提供解决方案!
欢呼声
学家
答案 0 :(得分:2)
谢谢jzd,但是它没有按你推荐的方式工作。 我认为在打开游标之前需要声明您正在处理的选择。为了做到这一点,我已经更新了这样的代码(我在网上找到了):
declare @str varchar(max)
declare cur cursor for
SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']'
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
AND TABLE_NAME LIKE 'Old_%'
open cur
FETCH NEXT FROM cur INTO @str
WHILE (@@fetch_status = 0)
BEGIN
EXEC (@str)
FETCH NEXT FROM cur INTO @str
END
close cur
deallocate cur
答案 1 :(得分:0)
你很亲密。您的游标不需要是动态的,只需选择表约束即可。然后你需要在循环中执行更新,在这里获取代码:
Open Dyn_Cursor
FETCH NEXT FROM Dyn_Cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
--Add Here
END
在Begin和End语句之间添加类似的内容:
SET @AlterTable = 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']
DROP CONSTRAINT ['' + @name + '']'
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = ''FOREIGN KEY''
AND TABLE_NAME LIKE ''Old_%'''
Exec(@AlterTable )
FETCH NEXT FROM Dyn_Cursor INTO @name