2012-04-06 84 views
2

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

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

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

+0

有时。看看XACT_ABORT。 – 2012-04-06 21:54:28

+5

“这取决于”。错误可以执行以下任何连接终止,范围堕胎。声明终止和批次堕胎。并不总是很直观地预测特定错误的类别。请参见[SQL 2000中的错误处理 - 背景](http://www.sommarskog.se/error-handling-I.html) – 2012-04-06 21:55:37

+0

@ ta.speot.is我认为XACT_ABORT OFF | ON只适用于批次。 – 2012-04-06 22:02:41

回答

1

这取决于error severity。从严重级19开始,批处理会中止:

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

然而请注意,如果代码上方的BEGIN TRY/BEGIN CATCH块内运行(或从这样的块称为),然后用10-18严重性导致错误的控制流程跳到catch块(这是不就像执行中止一样),因此下一条语句将会执行而不是

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

如果你想怎么写固态存储过程的代码模板,请参阅Exception handling and nested transactions

+0

请参考[链接](http://www.sommarskog.se/error_handling_2005.html)按照SQL Server 2005进行错误处理 – 2012-04-09 16:16:36