2012-04-13 46 views
3

獲得)EXEC(後@@ ERROR請參看下面的T-SQL代碼不能與錯誤

DECLARE @iError INT 
    EXEC('select * from sysobj') 
    SELECT @iError = @@ERROR 
    PRINT 'Error = ' + CAST(@iError AS VARCHAR(10)) 

我運行後,它會返回錯誤信息,這就是我想要的。

消息208,級別16,狀態1,行1
無效的對象名稱的sysobj「。
錯誤= 208

不過,如果我更改查詢

DECLARE @iError INT 
    EXEC('select * from sysobjects where ''c'' = 1') 
    SELECT @iError = @@ERROR 
    PRINT 'Error = ' + CAST(@iError AS VARCHAR(10)) 

輸出將是

消息245,級別16,狀態1,行1
轉換失敗當將varchar值'c'轉換爲數據類型int時。

問題是沒有執行EXEC()的任何代碼。

在真實的存儲過程中,我有一些代碼來處理PRINT後的錯誤。而這些代碼都沒有在第二種情況下執行。

有人能告訴我爲什麼會發生這種情況嗎?

我測試了這兩個SQL Server 2008和2005

感謝

+0

我認爲你需要向我們展示你正在嘗試和失敗來運行代碼。它是否在嘗試Catch塊? – HLGEM 2012-04-13 20:48:56

回答

2

不同的錯誤會有不同的中止級別,其中一些可以通過使用設置來控制,如ARITHIGNORE和ANSI_WARNINGS。

我建議閱讀以下文章,詳細解釋所有這些。

http://www.sommarskog.se/error-handling-I.html#whathappens

聲明,終止和批量流產

這兩組包括規則的運行時錯誤,如獨特的 指標重複,運行的磁盤空間等。正如我已經討論過,哪個 錯誤導致哪個行爲事先並不總是容易預測。此 表列出了一些常見錯誤,以及它們是否中止當前的 語句或整個批處理。

enter image description here

1

旁觀到你的錯誤處理實施TRY...CATCH。你應該能夠把所有的錯誤處理放在CATCH塊中。

+0

謝謝喬。是的,我使用TRY/CATCH更改了代碼,並且它可以正常工作。只是想知道爲什麼會發生這種情況。 – EricZ 2012-04-13 22:06:17

2

有MSDN上here這個的文章。它與運行EXEC()語句的上下文有關。如果在傳遞給EXEC()的參數中包含錯誤陷阱,則可以將其填入臨時表中,然後查看該表。

這裏是他們的榜樣:

DECLARE @cmd VARCHAR(1000), @ExecError INT 

CREATE TABLE #ErrFile (ExecError INT) 

SET @cmd = 'EXEC GetTableCount ' + 
'''pubs.dbo.authors''' + 
'INSERT #ErrFile VALUES(@@ERROR)' 

EXEC(@cmd) 

SET @ExecError = (SELECT * FROM #ErrFile) 

SELECT @ExecError AS '@@ERROR'