2014-12-01 40 views
1

我有一个存储过程中的游标中下面的代码我一起工作:当我从SQL游标中返回时会发生什么?

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 

这个错误检查有一些表插入(仍然光标内)前。最近我遇到了一个错误,我们插入的表与编写的插入语句不匹配(列名或提供的值的数量与表定义不匹配)。我一直认为这个错误检查代码会抓住这个并且终止这个过程,但是由于某种原因,它所做的只是向日志输出错误消息并继续运行。 Column name or number of supplied values does not match table definition是错误消息。

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

谢谢!

+1

两个问题......你为什么不使用try/catch块?你为什么使用光标?这看起来像一个典型的过程,其中光标不是做事情的最佳方式。 – 2014-12-01 21:15:28

回答

0

这个@@ ERROR函数的问题是,它的范围非常有限。只有在调用@@ 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块也可以访问到错误,只能在catch块中,可以帮助你获得详细的信息有关在Try..Block发生错误的功能。

错误的功能,如ERROR_MESSAGE(),ERROR_LINE(),ERROR_STATE(),ERROR_PROCEDURE()等

+0

不幸的是,我现在无法更改此代码,只能找出为什么程序没有在此处终止。我忘了提及上面的代码紧跟在insert语句之后。我唯一的问题是:这个return语句只会退出游标并继续运行其余的过程,还是会终止整个过程,即使它在游标内? – intA 2014-12-02 19:26:46

相关问题