在SQL Server中,如果第一个语句抛出错误,执行是否会移至下一个语句?

时间:2012-04-06 21:52:54

标签: sql-server tsql

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

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

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

1 个答案:

答案 0 :(得分:1)

这取决于error severity。从严重级别19开始,批次将中止:

  

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

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

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

如果您需要有关如何编写固态存储过程代码的模板,请参阅Exception handling and nested transactions