2016-01-07 68 views
1

我們正在使用Try/Catch block處理我們的stored procedures中的Exceptions。在stored procedure我有意做了一個error來檢查如何處理exceptions。我寫了一個stored procedure像下面,異常處理無法處理SQL-SERVER中的錯誤

CREATE PROCEDURE TEST 
AS 
BEGIN 
SET NOCOUNT ON; 
BEGIN TRY 
    BEGIN TRAN 

       ;WITH CTE 
       AS 
       (SELECT TOP 10 * 
       FROM student) 

       SELECT * FROM CTE 

       SELECT * INTO #VAL 
       FROM CTE 


     IF @@ERROR = 0 
       BEGIN 
        COMMIT TRAN; 
       END 
     END TRY 
     BEGIN CATCH 
       SELECT @@ERROR AS ERROR, ERROR_LINE() AS [Error Line], ERROR_MESSAGE() AS [Error Message] 
     ROLLBACK TRAN; 
     END CATCH 
SET NOCOUNT OFF; 
END 

在上面Stored procedure我使用了一個CTE多次。我預計SQL-SERVER將處理例外,但它沒有。儘管執行上述stored Procedure我下面error

消息208,級別16,狀態1,過程測試,行16

無效的對象名稱CTE「。

消息266,級別16,狀態2,過程測試,行16

事務計數後EXECUTE表示 失配數BEGIN和COMMIT語句。以前的計數= 1,當前計數= 2.

爲什麼不處理異常?有人可以提出這個想法嗎?

感謝您的幫助。

回答

1

存儲過程在執行時遵循延遲對象名稱解析。因此,在這種情況下cte是不存在的對象。

進一步嘗試捕捉不能處理這種類型的錯誤

以下類型的錯誤,當他們出現在同一級別的執行的TRY ... CATCH構造不catch塊處理的:

Compile errors, such as syntax errors, that prevent a batch from running. 


Errors that occur during statement-level recompilation, such as **object name resolution errors** that occur after compilation because of deferred name resolution 

請參閱MSDN以獲取更多信息(請參閱不受try catch影響的錯誤)

+0

感謝您教我和msdn鏈接真的很有用:) – bmsqldev

+0

樂意幫忙:) – TheGameiswar