在使用sp_MSforeachtable时,Microsoft SQL的下一个错误恢复时?

时间:2011-09-10 10:38:59

标签: c# sql-server sql-server-2008

我正在创建一个脚本,在使用Entity Framework重新创建表之前删除所有表。我通过实现为我这样做的IDatabaseInitializer来做到这一点。

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

我该怎样防止这种情况?这是我放弃桌子的方式。

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

现在,我将它放入一个while循环中,该循环一直执行直到删除所有表。但是,由于此命令按顺序删除所有表,并且在无法删除第一个表时失败,因此该脚本无效。

有没有办法让Microsoft SQL Server忽略任何错误,而是用下一个条目恢复表删除?

1 个答案:

答案 0 :(得分:2)

没有

您必须使用某种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.objects来删除FK:Drop all foreign keys in a table然后执行DROP TABLE

最后一点:因为SET QUOTED_IDENTIFIER

,在SQL中使用单引号而不是双引号