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

有帮助吗?

解决方案

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

其他提示

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

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

这需要 sp___drop___约束 您可以在以下位置找到脚本 数据库期刊:

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;

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

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

我最终使用了 Apache 的 德鲁提斯 为我执行删除操作,这在我的情况下解决了这个问题,尽管仅在 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 去掉。

  1. 使用 INFORMATION_SCHEMA 系统视图,检索与任何这些表相关的所有外键的列表
  2. 删除每个外键
  3. 现在您应该能够使用您想要的任何顺序删除所有表。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top