我有一个存储过程,它调用一系列存储过程作为帐户更新的一部分。不幸的是,我有10分钟的限制(与SQL-Server无关,外部超时),有时它超过了超时。 (在适当的条件下,它可能需要一个小时。)
我尝试了各种解决方案。代码大致与它的优化一样。一个解决方案就是让初始存储过程调用" real"存储过程;因为超时只知道初始proc,所以真正的proc可以继续畅通无阻。问题是SQL-Server嵌套了procs ... proc A完成它直到它调用的procs(procs B,C和D)完成。
SQL-Server的内部消息传递可以工作,但我们的数据库不兼容。 (我无法控制。)我考虑让初始proc设置一次性工作(稍后运行一分钟)并让工作调度程序运行它,但是如果我&#我们的DBA可能会很高兴39; m一直添加和删除作业。
存储过程有没有办法EXEC另一个存储过程,然后在被调用的proc继续运行时立即退出?
答案 0 :(得分:2)
我过去曾以两种方式解决这个问题。一种选择是设置Service Broker以将消息发送到队列中,并在Service Broker的另一端执行第二个存储过程。另一种方法是插入队列表并定期运行SQL代理作业(例如,每5-10分钟),执行第二个存储过程。无论是路由,您的第一个sproc将执行,成功完成事务,然后第二个过程(使用它自己的事务)将获取排队的工作并完成它。
对于Service Broker,此页面将有所帮助:http://msdn.microsoft.com/en-us/library/ms345108(v=sql.90).aspx
无论哪种方式,您在某个时刻都涉及DBA,但如果您有一个常规作业对队列表执行sproc,则无需一直添加和删除作业,只需添加和删除在队列表中工作(即,来自DBA的一次性请求,用于通过添加/删除作为OP提到的作业来进行设置与来自DBA的正在进行的请求)。