我有一個'驅動程序'存儲過程,它以特定順序執行多個過程。在這個驅動程序中有一些錯誤檢查檢查被執行的過程的返回代碼,如果它不等於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語句的一些小調整。我現在不是真的有能力重新處理整個事情。
你說得對。 @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
正確。你不能用NULL來做=或<>檢查。這就是爲什麼你有「IS NULL」和「IS NOT NULL」的原因之一。看到我最後一次對NULL進行評論。是的,它應該是ISNULL(@ return_status,1)<> 0。更新。 – 2014-12-04 19:47:16