我需要使用RAISERROR来发送消息(弹出消息)并提交该事务。是否有任何选项?
对于严重性18,事务得到回滚。我已将严重性更改为10并尝试
RAISERROR('Your Reference Number is %s',10,0,@param);
这但它提交了交易但没有显示消息。 我需要的是必须抛出消息并且必须提交事务
有什么建议吗?
答案 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