Rac*_*hel 45 sql-server-2005 sql-server stored-procedures
我们有一个存储过程,用户可以手动运行它来获取全天不断使用的报告的一些更新数字。
我有第二个存储过程应该在第一个存储过程运行后运行,因为它基于从第一个存储过程中获得的数字,但是运行时间更长,并且是一个单独的进程,所以我不想在第二个存储过程运行时让用户等待。
有没有办法让一个存储过程启动第二个存储过程,并立即返回而不等待结果?
我正在使用 SQL Server 2005。
Rac*_*hel 29
看起来有多种方法可以完成此操作,但我发现最简单的方法是Martin 建议在 SQL 作业中设置过程,并使用我的存储过程中的异步sp_start_job命令启动它。
EXEC msdb.dbo.sp_start_job @job_name='Run2ndStoredProcedure'
Run Code Online (Sandbox Code Playgroud)
这仅对我有用,因为我不需要为我的存储过程指定任何参数。
根据您的情况,其他可能有效的建议是
像Martin和Sebastian建议的那样使用SQL Service Broker。如果您不介意设置和了解其工作方式的复杂性,这可能是最好的建议。
像布朗斯通先生建议的那样,在负责执行存储过程的代码中异步运行进程。
一个不错的主意,但是在我的情况下,存储过程是从多个位置调用的,因此找到所有这些位置并确保它们也调用第二个过程似乎并不实用。另外,第二个存储过程相当关键,忘记运行它可能会给我们公司带来一些重大问题。
使第一个过程设置一个标志,并设置一个循环作业来检查该标志并在设置时运行,就像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卡普兰(SQL2005 +只)。如果是我,我可能会在更简单的场景中使用多个 SQL 代理作业,在更复杂的场景中使用 SSIS 包。
就您而言,调用 SQL 代理作业听起来是一个简单且易于管理的选择。
最后一条评论:SQL 已经尝试尽可能并行化单个操作*。这意味着同时运行 2 个任务而不是依次运行并不能保证它会更快完成。仔细测试,看看它是否真的改善了什么。
我们有一个开发人员创建了一个 DTS 包来同时运行 8 个任务。不幸的是,它只是一个 4-CPU 服务器 :)
*假设默认设置。这可以通过更改服务器的最大并行度或关联掩码,或使用 MAXDOP 查询提示来修改。
您可以将服务代理与队列中的激活一起使用。有了它,您可以在队列上发布过程调用的参数。这与插入所需的时间差不多。事务提交后,可能还有几秒钟,激活将自动异步调用接收器过程。不仅仅是wuold必须获取队列的参数并完成所需的工作。
是的,一种方法: