2014-12-04 52 views
1

我有一個'驅動程序'存儲過程,它以特定順序執行多個過程。在這個驅動程序中有一些錯誤檢查檢查被執行的過程的返回代碼,如果它不等於0,那麼它終止。以下是一些示例代碼:在INSERT語句中發生列不匹配時的SQL過程返回碼

... 
EXECUTE @return_status = data_validate 

IF @return_status <> 0 
BEGIN 
    SELECT return_status = 'FAIL', 
      return_msg = 'URS Data Validation Failed !!' 
    PRINT 'Data validation failed!' 
    RETURN 16 
END 
... 

在此data_validate過程中有一些表插入。在我遵守data_validate後,我意外地修改了其中一個表格的結構。如果我重新編譯了程序,它會給我一個錯誤,但那從未發生過。因此,下一次該驅動程序運行它執行data_validate丟給下面的錯誤:

消息213,級別16,狀態1,過程PERSONS_AFI 19行
列名或提供值的數目不匹配桌定義。

但是,返回代碼仍然是0,所以我的驅動程序過程繼續下去,並轉移到下一個過程。我理解這可能是TSQL如何處理這種情況,但有誰知道爲什麼?爲什麼即使程序中有錯誤,返回碼仍然爲0?這看起來不正確。我知道這個錯誤應該在編譯時被捕獲,但是該表只在編譯過程後才被修改。我會如何編寫這個驅動程序來捕捉這樣的錯誤?

謝謝!

編輯:這是一個巨大的系統,所以理想情況下我正在尋找對上述代碼中的錯誤捕獲IF語句的一些小調整。我現在不是真的有能力重新處理整個事情。

回答

1

如果SQL存儲過程失敗並出現非致命錯誤,則可能不會設置@return_status值,並且可能不是0 ...它可能爲NULL。

你應該能夠修改錯誤檢查邏輯添加一個空檢查:

IF ISNULL(@return_status,1) <> 0 

否則,您可以編輯您的存儲過程,以尋找那些獲取錯誤後通常設置@@ ERROR代碼INSERT,UPDATE和DELETE語句。

更新: 以下任何SQL都不會返回數據。對於NULL,你必須使用「IS NULL」和「IS NOT NULL」。或者專門處理NULL檢查。

IF NULL = 0 
    SELECT 1 
IF NULL <> 0 
    SELECT 1 
+0

你說得對。 @return_status是NULL。所以'IF @return_status <> 0'不會返回True?最後,我檢查NULL <> 0,但也許不符合SQL? 此外,不應該像'IF ISNULL(@ return_status,1)<> 0'這樣,當@return_status爲NULL時,它會將它設置爲1,因此不等於0並觸發錯誤? – intA 2014-12-04 19:27:28

+1

正確。你不能用NULL來做=或<>檢查。這就是爲什麼你有「IS NULL」和「IS NOT NULL」的原因之一。看到我最後一次對NULL進行評論。是的,它應該是ISNULL(@ return_status,1)<> 0。更新。 – 2014-12-04 19:47:16

相關問題