异常处理不处理SQL-SERVER中的错误

时间:2016-01-07 13:03:31

标签: sql sql-server tsql exception-handling

我们正在Exceptions使用stored procedures处理Try/Catch block。在stored procedure我故意制作error来检查exceptions的处理方式。我写了一个stored procedure,如下所示,

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

  

Msg 208,Level 16,State 1,Procedure TEST,Line 16

     

无效的对象名称'CTE'。

     

Msg 266,Level 16,State 2,Procedure TEST,Line 16

     

EXECUTE之后的事务计数表示不匹配的数量   BEGIN和COMMIT语句。先前的计数= 1,当前计数= 2.

为什么不处理异常?有人可以就此提出想法吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

存储过程在执行时遵循延迟对象名称解析。所以在这种情况下,cte是一个不存在的对象。

进一步尝试catch无法处理此类错误

当CATCH块与TRY ... 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影响的错误)