我们有一个存储过程,用户可以手动运行该存储过程,以获取全天不断使用的报告的一些更新数字。
我有第二个存储过程应该在第一个存储过程运行之后运行,因为它基于从第一个存储过程获得的数字,但是它需要更长的时间运行并且是一个单独的进程,所以我不想在第二个存储过程运行时让用户等待。
有没有办法让一个存储过程启动第二个存储过程,并立即返回而不等待结果?
我正在使用 SQL Server 2005。
我们有一个存储过程,用户可以手动运行该存储过程,以获取全天不断使用的报告的一些更新数字。
我有第二个存储过程应该在第一个存储过程运行之后运行,因为它基于从第一个存储过程获得的数字,但是它需要更长的时间运行并且是一个单独的进程,所以我不想在第二个存储过程运行时让用户等待。
有没有办法让一个存储过程启动第二个存储过程,并立即返回而不等待结果?
我正在使用 SQL Server 2005。
看起来有多种方法可以实现这一点,但我发现最简单的方法是Martin 建议在 SQL 作业中设置过程,并使用我的存储过程中的异步sp_start_job命令启动它。
这仅适用于我,因为我不需要为我的存储过程指定任何参数。
其他可能会根据您的情况起作用的建议是
使用Martin和Sebastian建议的SQL Service Broker 。如果您不介意设置和了解其工作原理的复杂性,这可能是最好的建议。
在负责执行存储过程的代码中异步运行该过程,就像Mr.Brownstone 建议的那样。
不错的主意,但是在我的情况下,存储过程是从多个地方调用的,因此找到所有这些地方并确保它们也调用第二个过程似乎并不实用。此外,第二个存储过程非常关键,忘记运行它可能会给我们公司带来一些重大问题。
让第一个过程设置一个标志,并设置一个重复的作业来检查该标志并在其设置时运行,就像Jimbo 建议的那样。我不喜欢持续运行并每隔几分钟检查一次更改的工作,但根据您的情况,这当然是一个值得考虑的选项。
这个老问题值得更全面的回答。其中一些在此处的其他答案/评论中提到,其他可能适用于 OP 的特定情况,也可能不适用,但可能适用于其他寻找从 SQL 异步调用存储过程的人。
完全明确地说:TSQL(本身)不具备异步启动其他 TSQL 操作的能力。
这并不意味着您仍然没有很多选择:
sp_start_job
. 如果您需要以编程方式监控它们的进度,只需确保每个作业都更新自定义 JOB_PROGRESS 表(或者您可以使用Gregory A. Larsen的这篇优秀文章xp_sqlagent_enum_jobs
中描述的未记录函数检查它们是否已完成)。您必须创建与运行并行进程一样多的单独作业,即使它们正在运行具有不同参数的相同存储过程。sp_oacreate
和sp_oamethod
启动一个新进程来调用彼此的存储过程,如本文所述,同样由 Gregory A. Larsen 撰写。Parallel_AddSql
,Parallel_Execute
如Alan Kaplan的这篇文章中所述(仅限 SQL2005+)。如果是我,我可能会在更简单的场景中使用多个 SQL 代理作业,在更复杂的场景中使用 SSIS 包。
在您的情况下,调用 SQL 代理作业听起来像是一个简单且易于管理的选择。
最后一条评论:SQL 已经尽可能地尝试并行化各个操作*。这意味着同时运行 2 个任务而不是一个接一个地运行并不能保证它会更快完成。仔细测试,看看它是否真的改善了任何东西。
我们有一个开发人员创建了一个 DTS 包来同时运行 8 个任务。不幸的是,它只是一个 4-CPU 服务器 :)
*假设默认设置。这可以通过更改服务器的最大并行度或亲和掩码,或使用 MAXDOP 查询提示来修改。
您可以将服务代理与队列上的激活一起使用。有了它,您可以在队列上发布过程调用的参数。这需要与插入一样多的时间。在事务提交后可能还有几秒钟,激活将自动异步调用接收器过程。它不仅仅是 wuold 必须获取队列的参数并完成所需的工作。
是的,一种方法:
另一种可能性是让第一个存储过程在完成时写入审计表,并在审计表上放置一个触发器,在写入审计表时启动第二个存储过程。无需连续轮询,也无需额外的 SQL Server 代理作业。