2013-05-07 41 views
1

我有一个存储过程,它调用一系列存储过程作为帐户更新的一部分。不幸的是,我有一个10分钟的限制(与SQL Server无关,外部超时),有时超过超时。 (在合适的条件下,可能会花费一个小时。)从另一个存储过程中调用一个存储过程而不需要**嵌套

我试过各种解决方案。代码大概和它将要获得的优化一样。一种解决方案就是将初始存储的proc调用称为“真实”存储过程;由于超时只知道最初的proc,所以真正的proc可以继续畅通无阻。问题是SQL-Server嵌套proc ... proc A直到它所调用的procs(procs B,C和D)完成后才会完成。

SQL-Server的内部消息传递可以工作,但我们的数据库不兼容。 (不在我的控制之下)。我想过让最初的proc创建一个一次性工作(稍后运行一次)并让job scheduler运行它,但是如果我添加的话,我们的DBA可能不会很开心并一直删除作业。

有没有办法让存储过程执行另一个存储过程,然后在被调用过程继续运行时立即退出?

回答

2

我已经用两种方法解决了这个问题。一种选择是设置Service Broker将消息发送到队列中,并在Service Broker的另一端执行第二个存储过程。另一种方法是插入到队列表中并定期运行SQL代理作业(例如,每隔5-10分钟)执行第二个存储过程。无论是哪条路线,您的第一个sproc都会执行,成功完成交易,然后第二个过程(通过它自己的交易)将接收排队的工作并完成它。

对于服务代理,该页面将帮助:http://msdn.microsoft.com/en-us/library/ms345108(v=sql.90).aspx

无论哪种方式,你在涉及一些DBA点,但如果你有,对队列表上执行一个存储过程一个经常性的工作,你不” t需要随时添加和删除作业,只需添加和删除队列表中的工作(即,从DBA进行安装的一次性请求与通过添加/删除作业的DBA的正在进行的请求(如OP所述) )。

+0

不“涉及”DBA,使其“调用”DBA。 – 2013-05-07 23:29:52

+0

我修改了一下。希望它更清楚一点。 – 2013-05-07 23:35:04

+0

对不起,那是个玩笑。 “涉及”是恰当的词。当你想要处理恶魔,恶魔,黑暗力量......和DBA时,“调用”就是你所做的。 – 2013-05-08 13:38:44

相关问题