如何在存储过程中进行错误处理

时间:2012-03-06 08:02:55

标签: tsql stored-procedures error-handling sybase-ase

我目前正在使用Sybase ASE 12.5。我的代码如下:

create procedure test_launcher_fail_wrapper
as
begin

   select convert(numeric(2),1234345)

   if @@error != 0
   begin
      select "SP failed to execute"
      return 1
   end

end

在这里,我试图将非常大的值/金额(1234345)转换为数字大小2.这是不可能的,它会产生错误。

问题:

  1. 这里有@@ error有用吗?我跑了这个SP,它从未进入过 错误处理
  2. 如何处理这类场景的错误?

3 个答案:

答案 0 :(得分:0)

我在procs中处理错误处理与应用程序中的错误处理类似 - 如果你有机会通过处理错误贡献一些实际值,那么一定要这样做,但如果你真的不能做任何事情为了帮助你,那么你最好放手吧。

作为添加值的示例,我有一个或两个在错误消息中添加上下文信息的过程,比如与更新操作冲突的ID值列表。在这种特殊情况下,我知道proc的上游消费者将记录此错误,并且操作员可以使用该文本,在调试问题时,他们会发现这些信息很有价值。我也知道,虽然这个条件是一个真正的错误,但它已经不时发生,并且格式化错误的努力是值得的。

答案 1 :(得分:0)

这是否能解决您的错误?

create procedure test_launcher_fail_wrapper
as
begin

  declare @database_err int

  set @database_err = 0

  select convert(numeric(2),1234345)

  set @database_err = @@error

  if @database_err <> 0
  begin
    PRINT  'SP failed to execute'
    return 1
  end

end

答案 2 :(得分:0)

@@error是要走的路,但要注意:

  

每个Transact-SQL语句(包括print语句和if测试)都会重置@@ error,因此状态检查必​​须紧跟在成功有问题的批处理之后。

关于如何在类似方案中处理错误管理的建议,您是否考虑过使用 raiserror

一个例子:

create procedure proc1 as
begin
    select convert(numeric(2),1234345)
    if @@error <> 0
    begin
        raiserror 20001 "Error during convert in proc1"
        return 1
    end
end