Catch在我的存储过程中不起作用 - 我的代码出了什么问题?

时间:2014-06-06 05:29:11

标签: sql sql-server visual-studio-2010 stored-procedures sqlclient

ALTER PROCEDURE uspTryCatchTest
AS
BEGIN TRY
    -- Table does not exist; object name resolution
    -- error not caught.
    SELECT * FROM NonexistentTable;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

当我执行此程序时,我得到对象名称解析错误...

如何修复

3 个答案:

答案 0 :(得分:3)

假设我们在谈论MS SQL Server,TRY / CATCH块只能处理某些类型的错误。无论您是否使用延迟名称解析,存储过程都会导致编译时错误。但是,如果你有一个TRY / CATCH块封装了对这个过程的调用,它将捕获错误。

...有趣的是,看起来你已经直接从reference page获取代码了。

  

当CATCH块不处理以下类型的错误   它们与TRY ... CATCH结构处于相同的执行级别:

     
      
  • 编译阻止批处理运行的错误,例如语法错误。
  •   
  • 语句级重新编译期间发生的错误,例如   作为编译后发生的对象名称解析错误,因为   延迟名称解析。
  •   

答案 1 :(得分:1)

我宁愿用它来检查表是否存在

IF NOT (EXISTS (SELECT * 
         FROM INFORMATION_SCHEMA.TABLES 
         WHERE TABLE_SCHEMA = 'dbo' 
         AND  TABLE_NAME = 'YourTable'))
BEGIN
    PRINT 'NOT Exists';
END

答案 2 :(得分:1)

ALTER PROCEDURE uspTryCatchTest
AS
BEGIN TRY
    -- Table does not exist; object name resolution
    -- error not caught.
    EXEC('SELECT * FROM NonexistentTable')
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

使用EXEC执行选择查询是有意义的

由于

相关问题