MS sql 2008尝试catch仍然抛出异常

时间:2014-07-07 09:32:12

标签: sql try-catch

我整天都在担心。 我的标签非常大 - '20317302009001'。 Zlecenie是int列 - 所以当比较zlecenie = @ label时,sql会生成错误。 我试图抓住它,但仍然得到消息:

  

Msg 248,Level 16,State 1,Procedure label_check,第9行   varchar值'20317302009001'的转换溢出了一个int列。   谁知道答案?   谢谢!

begin TRY 
if (@komponent is null) and ISNUMERIC(@label)=1  
 begin
  set @komponent=null
   if exists(select * from Rejestr_zuzycia_tkaniny where zlecenie=@label)
     begin
      declare @program int;
      select @program=program from Rejestr_zuzycia_tkaniny where zlecenie=@label
      select @komponent=komponent from Komponenty_programu where program=@program
     end;
 end; 
end TRY
begin CATCH
 set @komponent=null
end CATCH

1 个答案:

答案 0 :(得分:0)

从您的代码中看起来您实际上并未使用zlecenie作为数字,因此您可能希望通过首先将其作为varchar进行比较来进行比较:

if exists(select * from Rejestr_zuzycia_tkaniny where cast(zlecenie as varchar(20))=@label)

但是,如果您确实需要稍后处理zlecenie作为数字,例如将其添加到某个内容中,然后您可能希望将其设为bigint而不是int以适应较大的值。

MSDN对T-SQL中的TRY...CATCH说了一遍:

  

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

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

我认为算术溢出错误可能属于第二种情况,这可以解释为什么CATCH块无法处理它。但是,我无法在其他地方得到任何佐证,所以我建议你不要只听我的话。

相关问题