当使用sp_MSforeachtable时,Microsoft SQL的错误将继续

本文关键字:SQL Microsoft 错误 继续 sp MSforeachtable | 更新日期: 2023-09-27 18:08:25

我正在制作一个脚本,在使用实体框架重新创建它们之前删除所有表。我是通过实现一个IDatabaseInitializer来完成这个任务的。

但是,正如您可能已经猜到的那样,当试图删除具有外键约束的表时,它会失败,整个脚本将终止。

我该如何预防?我是这样放下桌子的。

context.Database.ExecuteSqlCommand("EXEC sp_MSforeachtable @command1 = '"DROP TABLE ?'"");

现在,我把它放入一个while循环中,它一直执行,直到所有表都被删除。但是,由于此命令按顺序删除所有表,并且当第一个表不能删除时失败,因此此脚本不起作用。

是否有办法使Microsoft SQL Server忽略任何错误,并以下一个条目代替恢复表删除?

当使用sp_MSforeachtable时,Microsoft SQL的错误将继续

您必须使用某种SQL脚本来迭代几次以处理几个级别的fk。

DECLARE @retry bit = 1
WHILE @retry = 1
BEGIN
    BEGIN TRY
       EXEC sp_MSforeachtable @command1 = 'DROP TABLE ?'
       SET @retry = 0
    END TRY
    BEGIN CATCH
       SET @retry = 1
    END CATCH
END

注意:删除所有表通常不是你在客户端代码中做的事情。尤其需要更高的权限来修改对象

另一种方法是先通过查询sys来删除fk。删除表中的所有外键,然后执行Drop TABLEs

最后一点:在SQL中使用单引号而不是双引号,因为SET QUOTED_IDENTIFIER