【问题标题】:How to execute a dynamically created sql statement如何执行动态创建的 sql 语句
【发布时间】:2011-07-02 14:12:21
【问题描述】:

我希望删除我拥有的所有表的约束。 由于这在 SQL Server 中是不可能的,因此我创建了一个脚本(基于在线找到的内容),它作为 Select 的结果动态创建 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

在此先感谢您的解决方案!

干杯

J.

【问题讨论】:

    标签: sql-server dynamic cursor


    【解决方案1】:

    谢谢你 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 
    

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2011-03-12
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 2020-05-27
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多