在完成执行之前从存储过程返回

时间:2009-12-16 22:37:31

标签: sql-server sql-server-2008

我们有一个存储过程,其中有两个部分。在第1部分中,需要将失败返回给应用程序,并且必须在存储过程返回之前完全执行该部分。

第2部分是一个漫长的过程,需要在调用过程时执行,但所有失败都可以忽略(或在其他地方处理),但是我们希望应用程序在完成之前返回。所以我们需要一个这样做的程序:

exec PART1
return
exec PART2 -- still gets executed, but after sql server has already responded that the SP was a success to the client.

我认为我们可能会将其作为“工作线程”执行此操作,但我不知道在SQL服务器中执行此操作的任何语法。

有什么想法吗?我是在正确的轨道上吗?你知道完成这个的语法吗?我是否会忽略某种更简单的方法来实现这一目标?

5 个答案:

答案 0 :(得分:2)

您可以在SQL Server中查看Implementing Jobs

这个想法是有两个存储过程,其中一个由程序调用,其中一个由作业调用。第一个的最后一个动作是运行(或安排)工作。另请参阅Running Jobs

答案 1 :(得分:1)

从未听说过这在SQL中是可行的。它希望通过SP处理批处理。

尽管如此,we find this

  

使用SQL Server Native时   客户端OLE DB提供者,应用程序   旨在初始化数据源   对象异步可以设置   DBPROPVAL_ASYNCH_INITIALIZE位   之前的DBPROP_INIT_ASYNCH财产   致电IDBInitialize::Initialize

这听起来像是在选择痛苦之路。如果您通过.NET调用存储过程并根据PART1中设置的条件,您的应用程序将决定是否运行PART2怎么办?

答案 2 :(得分:0)

您可以组合第一部分的存储过程和第二部分的触发器。

答案 3 :(得分:0)

有三种标准方法可以满足您的要求:

  1. 将作业排队到SQL代理
  2. 使用Service Broker激活启动另一个SP(可能是您最好的选择)
  3. 使用Service Broker消息传递向Windows服务发送消息,然后启动所需的SP

答案 4 :(得分:0)

有关如何在没有SQL代理调度程序参与的情况下执行此操作的示例,请参阅Asynchronous procedure execution。 SQL Agent有许多缺点:可扩展性,可靠性,故障转移方案,数据库备份/恢复一致性以及Express版本中的最低不可用性。链接中的解决方案通过利用Service Broker Activation机制克服了所有这些问题。