2011-02-23 132 views
3

我希望删除表中的所有约束条件。 (基于网络的东西找到)是动态创建的下降语句作为选择的结果 由于这是不可能在SQL Server中,我创建了一个脚本:如何执行一个动态创建的sql语句

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_%'' 

这做,我可以” t找到如何解析它并在循环中执行它。

我的尝试是建立一个光标这样的,但我不知道,然后让它执行各行:

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 

预先感谢您给谁将会有专门的解决方案!

欢呼

J.

回答

2

谢谢JZD,但它WASN按照你推荐的方式工作。 我认为在打开游标之前需要声明你正在处理的选择。为此,我更新了这样的代码(我在网上找到的代码):

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 
0

你接近。你的光标不需要是动态的,只需要选择表约束。然后,你需要执行循环内的更新,把你的代码在这里:

Open Dyn_Cursor 
    FETCH NEXT FROM Dyn_Cursor INTO @name 
    WHILE @@FETCH_STATUS = 0 
BEGIN 
--Add Here 
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