有没有一种简单的方法可以在 SQL Server 中删除一组相互关联的表?理想情况下,我想避免担心他们被丢弃的顺序,因为我知道整个团队都会在流程结束时消失。
7 回答
冒着听起来很愚蠢的风险,我不相信 SQL Server 支持删除/级联语法。我认为您可以配置删除规则来执行级联删除(http://msdn.microsoft.com/en-us/library/ms152507.aspx),但据我所知,SQL Server 的诀窍就是运行对于您要删除的每个表,您的删除查询一次,然后检查它是否有效。
一种不同的方法可能是:首先摆脱约束,然后一次性删除表。
换句话说,每个约束都有一个 DROP CONSTRAINT,然后每个表都有一个 DROP TABLE;在这一点上,执行顺序应该不是问题。
这需要您可以在Database Journal中找到的sp___drop___constraints脚本:
sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO
注意这一点 - 显然 - 如果您打算删除数据库中的所有表,所以要小心
我无权访问 SQL Server 来测试这个,但是如何:
DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
我不确定 Derek 的方法是否有效。您尚未将其标记为最佳答案。
如果不是:我猜使用 SQL Server 2005 应该是可能的。
他们在那里引入了异常(我还没有使用过)。因此,删除表,捕获异常,如果发生异常并尝试下一个表,直到它们都消失。
如果需要,您可以将表列表存储在临时表中并使用游标遍历它。
我最终使用 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,其中描述了删除表语法。
阻止您以任何顺序删除表的是表之间的外键依赖关系。所以在你开始之前摆脱FK。
- 使用 INFORMATION_SCHEMA 系统视图,检索与这些表中的任何一个相关的所有外键的列表
- 删除这些外键中的每一个
- 现在您应该能够使用您想要的任何顺序删除所有表。