SQL Server存储过程是否有自动退出错误的方法?

4

考虑以下存储过程:

CREATE PROCEDURE [dbo].[TestError]
    @Input int
AS
BEGIN
    DECLARE @Test int = 1 / 0;

    INSERT TestTable (Number) 
    VALUES (@Input);
END

并将其称为:

EXEC TestError 123;

执行此存储过程时,即使出现 "除以零" 错误,TestTable 表仍会被填充。
是否可以设置存储过程在出现错误时自动退出,以便不执行后续语句?

1
考虑使用try/catch。 - Sean Lange
1个回答

6
在你的存储过程开头添加 set xact_abort on;。这可以确保在出现错误时自动回滚事务,以避免数据不一致的情况发生。
create procedure [dbo].[TestError] @Input int as
begin
set xact_abort, nocount on;
    declare @Test int = 1 / 0;
    insert TestTable (Number) values (@Input);
end

为什么在SQL Server中总是需要包含 set xact_abort, nocount on; - Erland Sommarskog

出于历史原因,两个会话选项默认关闭,但经验证最佳实践是始终打开。当没有TRY-CATCH语句块时,SQL Server的默认行为是某些错误会中止执行并回滚任何打开的事务,而其他错误则继续执行下一条语句。当您启用XACT_ABORT ON时,几乎所有错误都会产生相同的效果:任何打开的事务都会回滚并且执行会被中止。其中有一些例外,其中最突出的是RAISERROR语句。- Erland Sommarskog


太好了,谢谢!这正是我在寻找的。 - reformed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接