【问题标题】:MS sql 2008 try catch still throws exceptionMS sql 2008 try catch 仍然抛出异常
【发布时间】:2014-07-07 09:32:12
【问题描述】:

我担心了一整天。 我的标签很大——“20317302009001”。 Zlecenie 是 int 列 - 因此 sql 在比较 zlecenie=@label 时会产生错误。 我试图抓住它,但仍然收到消息:

消息 248,级别 16,状态 1,过程 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

【问题讨论】:

    标签: sql try-catch


    【解决方案1】:

    从您的代码看来,您实际上并未将 zlecenie 用作数字,因此您可能希望先将其转换为 varchar 进行比较,如下所示:

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

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

    MSDN 对 T-SQL 中的 TRY...CATCH 有这样的说法:

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

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

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

    【讨论】:

    • 谢谢!你的建议非常好。我仍然想了解为什么它在保存“try-catch”子句中运行时会产生错误
    • @Piotr 我已更新我的答案以尝试解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多