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语句是否只会退出游标并仍然运行过程的其余部分,或者它是否会终止整个过程,即使它位于游标内?