-3

我需要使用 RAISERROR 来抛出一条消息(弹出消息)并提交该事务。有什么选择吗?

对于严重性 18,事务回滚。我已将严重性更改为 10 并尝试过

RAISERROR('Your Reference Number is %s',10,0,@param); 

这但它提交事务但不显示消息。我在这里需要的是必须抛出消息并且必须提交事务

有什么建议吗?

4

3 回答 3

5

严重性高于 10 的 RAISERROR 将被 ADO.Net 客户端视为异常。根据您的调用上下文的外观,这可能会或可能不会回滚事务。如果您在客户端使用 SqlTransaction 或 TransactionScope,或者在服务器端使用 BEGIN TRY/BEGIN CATCH 块,则可能会回滚事务。关键是 RAISERROR 既不提交也不回滚事务,是您自己的代码回滚或提交,我们无法从您的帖子中知道您在做什么。

严重性低于 10 的 RAISERROR 将被视为信息性消息,不会导致异常。请参阅数据库引擎错误严重性。这可能就是为什么你说“它没有显示信息”(不管是什么意思)。客户端框架以不同的方式处理信息性消息,例如 ADO.Net 将SqlConnection.InfoMessage在连接上引发事件但不会引发异常。您可能没有在您的应用程序中为此事件设置任何内容,并且您的代码只是忽略了信息消息。例如如何使用 InfoMessage 事件请参阅连接事件 (ADO.NET)

于 2011-07-22T15:35:22.227 回答
5

不要使用异常来传回“OK”消息。你不会在 ac# 或 java 程序中。异常意味着“我已经中止了,因为 SHTF”

您将使用 thsi 返回有意义的数据

SELECT 'Your Reference Number is ' + @param

在一个典型的模板中(来自我的答案包含 TRY CATCH ROLLBACK 模式的嵌套存储过程?

SET XACT_ABORT, NOCOUNT ON


BEGIN TRY

    BEGIN TRANSACTION

       [...Perform work, call nested procedures...]

    COMMIT TRANSACTION

    SELECT 'Your Reference Number is ' + @param

END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
于 2011-07-22T14:15:10.207 回答
0

听起来您需要使用WITH NOWAIT参数 for RAISERROR- 这将立即将其输出到消息窗口:

RAISERROR('Your Reference Number is %s',10,0,@param) WITH NOWAIT

于 2011-07-22T14:02:53.183 回答