2014-12-01 88 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

相關問題