在SQL Server中删除一组表

8

是否有一种简单的方法在SQL Server中删除一组相关联的表?理想情况下,我希望无需担心它们被删除的顺序,因为我知道整个组将在此过程结束时消失。

7个回答

4

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


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

注意 - 如果你的意思是要删除数据库中的所有表,请小心操作。


1

我不确定 Derek 的方法是否有效。你还没有将其标记为最佳答案。

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


1
一个不同的方法可能是:首先摆脱约束,然后一次性删除表格。
换句话说,对于每个约束都进行DROP CONSTRAINT操作,然后对于每个表格进行DROP TABLE操作;此时执行顺序不应该成为问题。

0

我没有访问SQL Server来测试这个,但是怎么样:

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

0

最终我使用了Apache的ddlutils来为我执行删除操作,在我的情况下,这解决了问题,不过一个只在SQL Server内部工作的解决方案会简单得多。

@Derek Park,我不知道你可以在那里对表进行逗号分隔,所以这很方便,但它似乎并没有按预期工作。似乎 SQL Server 既不认识 IF EXISTS 也不认识 CASCADE ,而运行drop table X, Y, Z只有在它们应该按照指定顺序被删除时才有效。

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


0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接