我们正在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.
为什么不处理异常?有人可以就此提出想法吗?
感谢您的帮助。
答案 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影响的错误)