我正在创建一个脚本,在使用Entity Framework重新创建表之前删除所有表。我通过实现为我这样做的IDatabaseInitializer来做到这一点。
但是,正如您可能已经猜到的那样,当尝试删除具有外键约束的表时,它会错误地失败,并且整个脚本都会终止。
我该怎样防止这种情况?这是我放弃桌子的方式。
context.Database.ExecuteSqlCommand("EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\"");
现在,我将它放入一个while循环中,该循环一直执行直到删除所有表。但是,由于此命令按顺序删除所有表,并且在无法删除第一个表时失败,因此该脚本无效。
有没有办法让Microsoft SQL Server忽略任何错误,而是用下一个条目恢复表删除?
答案 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中使用单引号而不是双引号