2011-02-23 52 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