none
sql2008r2 存储过程不能使用使用try catch捕捉exec错误 RRS feed

  • 问题

  • 程序代码示意,@sql为拼接的inser语句,该语句没有问题可以直接插入。

    begin try
          exec (@sql)
    end try
    begin catch
          raiserror error_message...
    end catch

    现在的问题是:
    如上在try中使用exec (@sql) 提示没有找到存储过程,直接转到end catch之后,不运行raiserror。在msdn中查到应该是属于语法或编译方面的问题,try不能捕获。如使用exec @sql 提示有无效的标示符,应该是在拼@sql用到表名变量,对同一结构的不同表进行插入。

    那现在是不是使用exec @sql就必须使用没有变量的语句才行


    2012年5月10日 7:05

答案

  • 首先,try catch 是 SQL 语句的一部分,所以是要在执行时才会工作,对于编译时就产生的错误自然无法捕获,另外 try .. catch 也无法捕获特别严重的错误

    所以错误处理不能完全依赖 try catch

    2012年5月10日 10:09
  • exec ("sql叙述")是用来执行动态SQL,exec 预存程序名称,是用来执行预存程序的,如果你的预存程序要动态执行必须使用还是要用Exec('exec 预存程序')的作法。

    use master
    go
    
    declare @sql varchar(max) = 'use northwind; select * from region'
    
    begin try
          exec (@sql)  --執行動態SQL
         --執行動態 Strored Procedure 
         set @sql = 'use northwind; exec usp_get_Region' 
          exec (@sql)
    end try
    begin catch
          raiserror (N'This is message %s %d.', -- Message text.
               10, -- Severity,
               1, -- State,
               N'number', -- First argument.
               5); -- Second argument.
    
    end catch


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月11日 10:12

全部回复

  • 首先,try catch 是 SQL 语句的一部分,所以是要在执行时才会工作,对于编译时就产生的错误自然无法捕获,另外 try .. catch 也无法捕获特别严重的错误

    所以错误处理不能完全依赖 try catch

    2012年5月10日 10:09
  • 关于 exec @sql 和 exec(@sql) 的问题,建议楼主看下 exec 的语法

    exec 不加括号的时候,后面的 @sql 代表的是要调用的对象名称,不是一条 t-sql 语句

    2012年5月10日 10:10
  • exec ("sql叙述")是用来执行动态SQL,exec 预存程序名称,是用来执行预存程序的,如果你的预存程序要动态执行必须使用还是要用Exec('exec 预存程序')的作法。

    use master
    go
    
    declare @sql varchar(max) = 'use northwind; select * from region'
    
    begin try
          exec (@sql)  --執行動態SQL
         --執行動態 Strored Procedure 
         set @sql = 'use northwind; exec usp_get_Region' 
          exec (@sql)
    end try
    begin catch
          raiserror (N'This is message %s %d.', -- Message text.
               10, -- Severity,
               1, -- State,
               N'number', -- First argument.
               5); -- Second argument.
    
    end catch


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月11日 10:12