当使用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忽略任何错误,并以下一个条目代替恢复表删除?
不
您必须使用某种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