我有一个包含多个更新和插入查询的 SP。如果任何查询给出错误,执行是否移至下一条语句?例如,
CREATE PROCEDURE Test()
AS
BEGIN
INSERT INTO SomeTable VALUES (1, 2, 3)
UPDATE SomeTable SET X = 4 WHERE Y = 5
END
在上面的例子中,如果 INSERT 语句抛出错误,执行会移动到下一个 UPDATE 语句吗?
我有一个包含多个更新和插入查询的 SP。如果任何查询给出错误,执行是否移至下一条语句?例如,
CREATE PROCEDURE Test()
AS
BEGIN
INSERT INTO SomeTable VALUES (1, 2, 3)
UPDATE SomeTable SET X = 4 WHERE Y = 5
END
在上面的例子中,如果 INSERT 语句抛出错误,执行会移动到下一个 UPDATE 语句吗?
这取决于错误的严重性。从严重性 19 及以上,批处理被中止:
指示已超出不可配置的数据库引擎限制,并且当前批处理已终止。严重级别为 19 或更高的错误消息会停止当前批处理的执行。
但是请注意,如果上面的代码在一个BEGIN TRY/BEGIN CATCH
块内运行(或从这样一个块调用),那么严重性为 10-18 的错误会导致控制流跳转到 catch 块(这与说执行被中止不同) ),因此不会执行下一条语句。
此外,该XACT_ABORT
设置还会导致当前事务回滚和当前批处理中止。
如果您想要一个如何编写可靠存储过程代码的模板,请参阅异常处理和嵌套事务