【问题标题】:Pass status information from Stored Procedure to caller inside transaction将状态信息从存储过程传递给事务内部的调用者
【发布时间】:2011-02-08 05:16:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql-server tsql ado.net


    【解决方案1】:

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

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

    了解详情。

    【讨论】:

    • +1 PRINT 基本上是RAISERROR,严重性为 0,因此订阅此事件应该适用于两种方法。
    【解决方案2】:

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

    例子:

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

    【讨论】:

    • 感谢 Joe/Martin,看起来 RAISERROR/NOWAIT 加上 InfoMessage 事件正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多