从TSQL进程返回错误的最佳方式是什么?

从TSQL进程返回错误的最佳方式是什么?,tsql,error-handling,Tsql,Error Handling,以下是场景: 加载一个页面,该页面根据数据库中的数据进行呈现(称为“假设”) 有人改变了假设 你提交你的页面 错误 解决这个问题的一般模式是(对吗?): 在保存过程中,在开始和提交事务中,首先验证假设。如果其中任何一个发生了更改,您应该返回一条优美的错误消息,类似于您遇到问题的ID的XML列表,您可以在页面中处理该消息,而不是让默认的错误处理基础结构来处理它 所以我的问题是什么是最好的方法 返回未设置的xml列表和错误标志in out参数,如果正确完成,返回0 使用out参数返回错误状态,并且

以下是场景:

  • 加载一个页面,该页面根据数据库中的数据进行呈现(称为“假设”)
  • 有人改变了假设
  • 你提交你的页面
  • 错误 解决这个问题的一般模式是(对吗?):

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

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

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

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

    使用具有适当严重性和/或等待级别的
    RAISEERROR
    函数。如果使用较低的严重性,则不一定会导致异常,正如您所主张的那样,对于.Net来说,检索这些消息非常简单。唯一的缺点是,在.Net中使用StoredProcedure命令类型时,消息只能以50组的形式发送


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

    我将使用一条消息作为输出参数,如果出现错误,返回的内容将已经不是0


    另外,要小心注定失败的交易,并检查xact_错误,请参见

    我同意-我喜欢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;