Sql server 当我从SQL游标内部返回时会发生什么?
我正在处理的存储过程中的游标中有以下代码:Sql server 当我从SQL游标内部返回时会发生什么?,sql-server,sql-server-2008,tsql,stored-procedures,return,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 !!'
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
选择@err\u code=@@error
如果@err_代码为0
开始
回滚传输
选择return_status='FAIL',
return\u msg='插入错误警告失败!!'
返回16
结束
在此错误检查之前,有一些表插入(仍在光标内)。最近我遇到一个错误,我们插入的表与编码的insert语句不匹配(列名或提供的值数与表定义不匹配)。我本以为这个错误检查代码会捕捉到这一点并终止该过程,但出于某种原因,它所做的只是在日志中打印一条错误消息并继续运行<代码>列名或提供的值数与表定义不匹配是错误消息
所以我想知道这是否与返回位于游标内部有关。在这种情况下,返回16
所做的一切是否都可能是退出游标并继续执行存储过程的其余部分?还是应该完全终止程序?我正在使用MS SQL Server 2008
谢谢大家! 这个@ERROR函数的问题是,它的范围非常有限。只有在调用@error函数之前执行的语句中出现错误时,才会填充该函数 如果在该错误发生之前或之后执行任何其他语句,@@错误将返回NULL 另外,要预测错误可能发生的位置,并在一段时间内捕获它的值并在那里停止执行,这有点痛苦而且容易出错 sql server中最好的错误处理方法是try..catch块
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块?你为什么要用光标?这看起来像是一个典型的过程类型,其中游标不是执行操作的最佳方式。不幸的是,我现在无法更改此代码,只能找出过程为什么没有在此处终止。我忘了提到上面的代码紧跟insert语句。我唯一的问题是:这个return语句是否只会退出游标并仍然运行过程的其余部分,或者它是否会终止整个过程,即使它位于游标内?