Sql server 在事务内部将状态信息从存储过程传递给调用方
我有一个长期运行的SP(它最多可以运行几分钟),它基本上对事务中的各种表执行许多清理操作。我正在尝试确定以某种方式将人类可读的状态信息传递回调用者的最佳方式,即SP当前正在执行的流程步骤Sql server 在事务内部将状态信息从存储过程传递给调用方,sql-server,tsql,ado.net,Sql Server,Tsql,Ado.net,我有一个长期运行的SP(它最多可以运行几分钟),它基本上对事务中的各种表执行许多清理操作。我正在尝试确定以某种方式将人类可读的状态信息传递回调用者的最佳方式,即SP当前正在执行的流程步骤 因为整个SP都在一个事务中运行,所以我不能把这个信息写回状态表,然后从另一个线程读取它,除非我使用NoLoCK来读取它,我认为这是自 NOLOCK会导致其他数据不一致问题;及 这使得任何想要读取状态表的人都有责任使用NOLOCK,因为表或行可能会被锁定一段时间 是否有任何方法可以在事务中发出单个命令(或执行
因为整个SP都在一个事务中运行,所以我不能把这个信息写回状态表,然后从另一个线程读取它,除非我使用NoLoCK来读取它,我认为这是自
- NOLOCK会导致其他数据不一致问题;及
- 这使得任何想要读取状态表的人都有责任使用NOLOCK,因为表或行可能会被锁定一段时间
RAISERROR(N'Step 5 completed.', 10, 1) WITH NOWAIT;
您可以尝试在过程中使用(严重性为10或更低)返回信息性消息
例如:
RAISERROR(N'Step 5 completed.', 10, 1) WITH NOWAIT;
您可以在T-SQL中打印消息,并通过“InfoMessage”事件将它们发送到ADO.NET中的SqlConnection。看
详细信息。您可以在T-SQL中打印消息,并通过“InfoMessage”事件将它们发送到ADO.NET中的SqlConnection。看
详细信息。+1
PRINT
基本上是RAISERROR
,严重性为0,因此订阅此事件应适用于两种方法。+1PRINT
基本上是RAISERROR
严重性为0,因此订阅此事件应适用于两种方法。感谢Joe/Martin,看起来RAISERROR/NOWAIT加上InfoMessage事件正是我要找的。谢谢Joe/Martin,看起来RAISERROR/NOWAIT加上InfoMessage事件正是我要找的。