当我从SQL游标内部返回时会发生什么?

时间:2014-12-01 21:00:03

标签: sql-server sql-server-2008 tsql stored-procedures return

我在使用的存储过程中的游标中有以下代码:

SELECT @err_code = @@error

        If @err_code <> 0
            BEGIN
                ROLLBACK TRAN
                Select return_status = 'FAIL',
                return_msg = 'Insert Into Errs Warnings Failed !!'
                return 16
            END

在此错误检查之前,有一些表插入(仍在游标内)。最近我遇到一个错误,我们插入的表与编码的insert语句不匹配(列名或提供的值的数量与表定义不匹配)。我本以为这个错误检查代码会抓住这个并杀死程序,但由于某种原因它所做的只是向日志打印一条错误消息并继续运行。 Column name or number of supplied values does not match table definition是错误消息。

所以我想知道这是否与光标内部的返回有关。有可能在这种情况下,所有return 16所做的就是退出光标并继续执行其余的存储过程吗?或者它应该完全终止程序?我正在使用MS SQL Server 2008。

谢谢!

1 个答案:

答案 0 :(得分:0)

这个@@ ERROR函数的问题是,它的范围非常有限。只有在调用@@ ERROR函数之前执行的语句中发生错误时,才会填充它。

如果在发生错误之前执行任何其他语句或在该错误发生后调用,则@@ ERROR将返回NULL。

另外,为了预测可能发生错误的位置,并及时捕获其值并在那里停止执行,它有点痛苦和容易出错。

sql server中错误处理的最佳方法是try..catch block。

BEGIN TRY 

 BEGIN TRANSACTION 

 -- your code here 


 COMMIT TRANSACTION    --<-- this will only be executed if nothing 
                          -- goes wrong in prior statements
END TRY

BEGIN CATCH 
  ROLLBACK TRANSACTION; 

  Select return_status = 'FAIL',
         return_msg = 'Insert Into Errs Warnings Failed !!'
END CATCH

使用Try ... Catch块还允许您访问只能在CATCH BLOCK中使用的Error函数,并且可以帮助您获取有关Try..Block中发生的错误的详细信息。

错误函数,如ERROR_MESSAGE(),ERROR_LINE(),ERROR_STATE(),ERROR_PROCEDURE()等