如何使用RAISERROR抛出消息并提交事务?

bal*_*569 -3 sql raiserror sql-server-2008

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

对于严重性18,事务得到了回滚.我已将严重性更改为10并尝试了

RAISERROR('Your Reference Number is %s',10,0,@param); 
Run Code Online (Sandbox Code Playgroud)

这但它提交了交易,但没有显示消息.我需要的是必须抛出消息并且必须提交事务

有什么建议吗?

gbn*_*gbn 5

不要使用异常来传回"OK"消息.你不会在ac#或java程序中.例外意味着"因为SHTF我已经流产"

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

SELECT 'Your Reference Number is ' + @param
Run Code Online (Sandbox Code Playgroud)

在一个典型的模板(从我的回答嵌套存储过程包含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
Run Code Online (Sandbox Code Playgroud)

  • "我的前端不接受这个"意味着什么?你能详细说说吗? (2认同)

Rem*_*anu 5

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

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