如何执行动态创建的sql语句

时间:2011-02-23 08:30:11

标签: sql-server dynamic cursor

我希望放弃我所拥有的桌子的所有限制。 由于这在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

提前感谢您为此提供解决方案!

欢呼声

学家

2 个答案:

答案 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