我需要使用 RAISERROR 来抛出一条消息(弹出消息)并提交该事务。有什么选择吗?
对于严重性 18,事务回滚。我已将严重性更改为 10 并尝试过
RAISERROR('Your Reference Number is %s',10,0,@param);
这但它提交事务但不显示消息。我在这里需要的是必须抛出消息并且必须提交事务
有什么建议吗?
我需要使用 RAISERROR 来抛出一条消息(弹出消息)并提交该事务。有什么选择吗?
对于严重性 18,事务回滚。我已将严重性更改为 10 并尝试过
RAISERROR('Your Reference Number is %s',10,0,@param);
这但它提交事务但不显示消息。我在这里需要的是必须抛出消息并且必须提交事务
有什么建议吗?
严重性高于 10 的 RAISERROR 将被 ADO.Net 客户端视为异常。根据您的调用上下文的外观,这可能会或可能不会回滚事务。如果您在客户端使用 SqlTransaction 或 TransactionScope,或者在服务器端使用 BEGIN TRY/BEGIN CATCH 块,则可能会回滚事务。关键是 RAISERROR 既不提交也不回滚事务,是您自己的代码回滚或提交,我们无法从您的帖子中知道您在做什么。
严重性低于 10 的 RAISERROR 将被视为信息性消息,不会导致异常。请参阅数据库引擎错误严重性。这可能就是为什么你说“它没有显示信息”(不管那是什么意思)。客户端框架以不同的方式处理信息性消息,例如 ADO.Net 将SqlConnection.InfoMessage
在连接上引发事件但不会引发异常。您可能没有在您的应用程序中为此事件设置任何内容,并且您的代码只是忽略了信息消息。例如如何使用 InfoMessage 事件请参阅连接事件 (ADO.NET)
不要使用异常来传回“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
听起来您需要使用WITH NOWAIT
参数 for RAISERROR
- 这将立即将其输出到消息窗口:
RAISERROR('Your Reference Number is %s',10,0,@param) WITH NOWAIT