【发布时间】:2010-09-05 16:05:45
【问题描述】:
有没有一种简单的方法可以在 SQL Server 中删除一组相互关联的表?理想情况下,我不想担心他们被放入的顺序,因为我知道整个过程结束时整个团队都会消失。
【问题讨论】:
标签: sql sql-server database
有没有一种简单的方法可以在 SQL Server 中删除一组相互关联的表?理想情况下,我不想担心他们被放入的顺序,因为我知道整个过程结束时整个团队都会消失。
【问题讨论】:
标签: sql sql-server database
这需要 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
注意这 - 很明显 - 如果你打算删除数据库中的所有表,所以要小心
【讨论】:
冒着听起来很愚蠢的风险,我不相信 SQL Server 支持删除/级联语法。我认为您可以配置删除规则来执行级联删除 (http://msdn.microsoft.com/en-us/library/ms152507.aspx),但据我所知,SQL Server 的诀窍是只为要删除的每个表运行一次删除查询,然后检查它是否有效.
【讨论】:
一种不同的方法可能是:首先摆脱约束,然后一次性删除表。
换句话说,每个约束都有一个 DROP CONSTRAINT,然后每个表都有一个 DROP TABLE;此时执行顺序应该不是问题。
【讨论】:
阻止您以任何顺序删除表的是表之间的外键依赖关系。因此,在开始之前摆脱 FK。
【讨论】:
我最终使用 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 语法。
【讨论】:
我不确定 Derek 的方法是否有效。您尚未将其标记为最佳答案。
如果不是:我猜使用 SQL Server 2005 应该是可能的。
他们在那里引入了异常(我还没有使用过)。因此,删除表,捕获异常,如果发生异常并尝试下一个表,直到它们都消失。
如果需要,您可以将表列表存储在临时表中并使用游标遍历它。
【讨论】:
我无权访问 SQL Server 来测试这个,但是如何:
DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
【讨论】: