如果由于违反外键约束而无法成功执行删除语句,是否有办法在SQL Server中中止存储过程?默认情况下,该过程似乎忽略错误并继续下一个语句。在外键约束违规中取消存储过程
但是,对于其他类型的错误(例如,从不存在的表中删除),过程将中止。
示例步骤:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestSP]
AS
BEGIN
SET NOCOUNT ON;
print 'BEFORE';
DELETE FROM ExistingWithConstraints;
print 'AFTER DELETE ExistingWithConstraints';
DELETE FROM NonExisting;
print 'AFTER DELETE NonExisting';
END
产生输出(请注意,上述的最后一个消息不打印):
BEFORE
<snip constraint violation error message>
AFTER DELETE ExistingWithConstraints
<snip invalid object name error message>
如果'@@ TRANCOUNT> 0',您可以使用保存点来回滚由“TestSP”完成的err处理程序修改 - 这是我们在此使用的更通用的模式。 – wqw
@wqw:我自己不使用保存点:数据库调用应该是原子的。我跟着我的链接,你会看到Remus使用这些模板的另一个模板。您还必须小心使用XACT_ABORT,这会导致交易失败 – gbn