【问题标题】:Dropping a group of tables in SQL Server在 SQL Server 中删除一组表
【发布时间】:2010-09-05 16:05:45
【问题描述】:

有没有一种简单的方法可以在 SQL Server 中删除一组相互关联的表?理想情况下,我不想担心他们被放入的顺序,因为我知道整个过程结束时整个团队都会消失。

【问题讨论】:

    标签: sql sql-server database


    【解决方案1】:

    这需要 sp___drop___constraints 脚本,您可以在 Database Journal 找到:

    sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
    GO
    sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
    GO
    

    注意这 - 很明显 - 如果你打算删除数据库中的所有表,所以要小心

    【讨论】:

      【解决方案2】:

      冒着听起来很愚蠢的风险,我不相信 SQL Server 支持删除/级联语法。我认为您可以配置删除规则来执行级联删除 (http://msdn.microsoft.com/en-us/library/ms152507.aspx),但据我所知,SQL Server 的诀窍是只为要删除的每个表运行一次删除查询,然后检查它是否有效.

      【讨论】:

        【解决方案3】:

        一种不同的方法可能是:首先摆脱约束,然后一次性删除表。

        换句话说,每个约束都有一个 DROP CONSTRAINT,然后每个表都有一个 DROP TABLE;此时执行顺序应该不是问题。

        【讨论】:

          【解决方案4】:

          阻止您以任何顺序删除表的是表之间的外键依赖关系。因此,在开始之前摆脱 FK。

          1. 使用 INFORMATION_SCHEMA 系统视图,检索与任何这些表相关的所有外键的列表
          2. 删除这些外键中的每一个
          3. 现在您应该可以使用任何您想要的顺序删除所有表了。

          【讨论】:

            【解决方案5】:

            我最终使用 Apache 的 ddlutils 为我执行删除操作,这在我的情况下解决了问题,尽管仅在 sql server 中工作的解决方案会简单得多。

            @Derek Park,我不知道你可以在那里用逗号分隔表格,所以这很方便,但它似乎并没有像预期的那样工作。 Nether IF EXISTS 和 CASCADE 似乎都被 sql server 识别,并且运行 drop table X, Y, Z 似乎只有在它们应该按规定的顺序删除时才有效。

            另请参阅 http://msdn.microsoft.com/en-us/library/ms173790.aspx,它描述了 drop table 语法。

            【讨论】:

              【解决方案6】:

              我不确定 Derek 的方法是否有效。您尚未将其标记为最佳答案。

              如果不是:我猜使用 SQL Server 2005 应该是可能的。
              他们在那里引入了异常(我还没有使用过)。因此,删除表,捕获异常,如果发生异常并尝试下一个表,直到它们都消失。
              如果需要,您可以将表列表存储在临时表中并使用游标遍历它。

              【讨论】:

                【解决方案7】:

                我无权访问 SQL Server 来测试这个,但是如何:

                DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
                

                【讨论】:

                  猜你喜欢
                  • 2012-03-23
                  • 2015-11-13
                  • 2023-02-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-09-30
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多