2

我有一个包含多个更新和插入查询的 SP。如果任何查询给出错误,执行是否移至下一条语句?例如,

CREATE PROCEDURE Test()
AS
BEGIN
    INSERT INTO SomeTable VALUES (1, 2, 3)
    UPDATE SomeTable SET X = 4 WHERE Y = 5
END

在上面的例子中,如果 INSERT 语句抛出错误,执行会移动到下一个 UPDATE 语句吗?

4

1 回答 1

1

这取决于错误的严重性。从严重性 19 及以上,批处理被中止:

指示已超出不可配置的数据库引擎限制,并且当前批处理已终止。严重级别为 19 或更高的错误消息会停止当前批处理的执行。

但是请注意,如果上面的代码在一个BEGIN TRY/BEGIN CATCH块内运行(或从这样一个块调用),那么严重性为 10-18 的错误会导致控制流跳转到 catch 块(这与执行被中止不同) ),因此不会执行下一条语句。

此外,该XACT_ABORT设置还会导致当前事务回滚当前批处理中止。

如果您想要一个如何编写可靠存储过程代码的模板,请参阅异常处理和嵌套事务

于 2012-04-06T23:03:37.673 回答