【问题标题】:What is the best way to return an error from a TSQL Proc?从 SQL Proc 返回错误的最佳方法是什么?
【发布时间】:2009-02-11 15:35:18
【问题描述】:

场景如下:

  1. 您加载一个页面,该页面根据数据库中的数据呈现(将这些称为“假设”)
  2. 有人改变了假设
  3. 您提交您的页面
  4. 错误!

解决这个问题的一般模式是这样的(对吗?):

在您的保存过程中,在开始和提交事务中,您首先验证您的假设。如果其中任何一个发生更改,您应该返回一个优雅的错误消息,例如您遇到问题的 ID 的 XML 列表,您可以在 page 中处理它,而不是让它由默认错误处理处理基础设施。

所以我的问题是最好的方法是什么?

  • 返回未设置的 xml 列表和 out 参数中的错误标志,如果正确完成则返回 0?
  • 使用out参数返回错误状态,proc的结果是错误列表还是proc的有效结果?
  • 还有别的吗? (我应该注意 raiseerror 会导致 proc 出错,并被默认的错误处理代码拾取)

更新:我想返回一个可操作的失败 ID 列表(我计划在应用程序中突出显示这些单元格)。我可以在 RAISEERROR 中以 CSV 格式返回它们,但这看起来很脏。

【问题讨论】:

    标签: tsql error-handling


    【解决方案1】:

    我同意 - 我喜欢 RAISEERROR:

    --  Validate @whatever 
    IF @whatever >= '5'
    BEGIN
        RAISERROR ('Invalid value for @whatever - expected a value less than 5, but received %s.', 10, 1, @whatever)
        RETURN 50000
    END;
    

    【讨论】:

      【解决方案2】:

      使用具有适当严重性和/或等待级别的RAISERROR 函数。如果您使用低严重性,这不一定会导致异常,正如您所争辩的那样,并且至少使用 .Net 检索这些消息非常简单。唯一的缺点是 .Net 中的 StoredProcedure 命令类型只能以 50 条为一组发送消息。

      存储过程可以返回多个结果集。根据您的更新,您还可以将错误的 id 插入临时表中,然后在过程结束时从该表中选择记录作为您可以查看的附加结果集。

      【讨论】:

        【解决方案3】:

        我会做一个带有消息的输出参数,如果有错误,返回已经有不是0的东西

        还要小心注定的交易并检查 xact_error,请参阅Use XACT_ABORT to roll back non trapable error transactions

        【讨论】:

          猜你喜欢
          • 2013-03-30
          • 2010-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          • 2010-09-07
          • 2014-10-15
          相关资源
          最近更新 更多