是否有一种简单的方法在SQL Server中删除一组相关联的表?理想情况下,我希望无需担心它们被删除的顺序,因为我知道整个组将在此过程结束时消失。
是否有一种简单的方法在SQL Server中删除一组相关联的表?理想情况下,我希望无需担心它们被删除的顺序,因为我知道整个组将在此过程结束时消失。
冒着听起来很蠢的风险,我不认为SQL Server支持删除/级联语法。我认为您可以配置删除规则以执行级联删除(http://msdn.microsoft.com/en-us/library/ms152507.aspx),但据我所知,使用SQL Server的技巧就是针对每个要删除的表运行一次drop查询,然后检查它是否起作用。
这需要使用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
注意 - 如果你的意思是要删除数据库中的所有表,请小心操作。
我不确定 Derek 的方法是否有效。你还没有将其标记为最佳答案。
如果不行:我想在 SQL Server 2005 中应该是可能的。
他们引入了异常(我还没有使用过)。因此,删除表格,捕获异常(如果有),然后尝试下一个表格,直到它们全部消失。
您可以将表格列表存储在临时表中,并使用游标遍历它,如果您想这样做。
我没有访问SQL Server来测试这个,但是怎么样:
DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
最终我使用了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 语法。
阻止您按任何顺序删除表格的是表格之间的外键依赖关系。因此,在开始之前,先摆脱FK。