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

时间:2011-07-22 13:56:06

标签: sql sql-server-2008 raiserror

我需要使用RAISERROR来发送消息(弹出消息)并提交该事务。是否有任何选项?

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

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

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

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

不要使用例外来传回" OK"消息。你不会在c#或java程序中。例外意味着"我因为SHTF"

而中止

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

SELECT 'Your Reference Number is ' + @param

在典型的模板中(来自我的回答Nested stored procedures containing TRY CATCH ROLLBACK pattern?

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

听起来您需要使用WITH NOWAIT的{​​{1}}参数 - 这会立即将其输出到消息窗口:

RAISERROR