我在使用的存储过程中的游标中有以下代码:
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。
谢谢!
答案 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()等