将状态信息从存储过程传递到事务中的调用者

时间:2011-02-07 21:04:36

标签: sql-server tsql ado.net

我有一个长时间运行的SP(它可以运行长达几分钟),它基本上对事务中的各个表执行了许多清理操作。我正在尝试确定以某种方式将人类可读状态信息传递给调用者的最佳方式,即SP正在执行的流程的哪一步。

因为整个SP在单个事务中运行,所以我无法将此信息写回状态表,然后从另一个线程读取它,除非我使用NOLOCK读取它,我认为这是最后的手段:

  • NOLOCK会导致其他数据不一致问题;和
  • 这对任何想要阅读他们需要使用NOLOCK状态表的人都有责任,因为这些表或行可能会被锁定很长一段时间。

有没有办法在事务中发出单个命令(或EXEC第二个SP)并告诉指定该特定命令不应该是事务的一部分?或者是否有其他方法让ADO.NET深入了解这个长期运行的SP以了解它目前正在做什么?

2 个答案:

答案 0 :(得分:3)

您可以尝试在过程中使用RAISERROR(使用10或更低的严重性)来返回信息性消息。

示例:

RAISERROR(N'Step 5 completed.', 10, 1) WITH NOWAIT;

答案 1 :(得分:3)

您可以在T-SQL中打印消息,并通过“InfoMessage”事件将它们传递到ADO.NET中的SqlConnection。参见

http://msdn.microsoft.com/en-us/library/a0hee08w.aspx

了解详情。