【问题标题】:Are multiple stored procedure calls in SQL Server Agent command window run in parallel or sequentially?SQL Server 代理命令窗口中的多个存储过程调用是并行运行还是顺序运行?
【发布时间】:2018-04-25 15:47:11
【问题描述】:

我有一个运行一系列存储过程的 SQL Server 代理作业。这是一个单步作业,在包的命令窗口中显示以下内容:

exec fb_GetDateSource '6A0DA1EB-D349-4D97-AAFC-822343D8EB49'

exec fb_DeliverFile '2344EC77-0D34-44A9-8A10-E5FEA1F6F218'
exec fb_DeliverFile '0BF456B8-24E5-4B0E-8FDA-F31C2D397B3A'
exec fb_DeliverFile 'C42EA4AA-3179-4344-BE24-5CEBA435F4FD'

所以第一行将一堆数据收集到一个临时表中,然后接下来的 3 行将使用这些数据将数据文件传递给我们的客户。我们在旧数据进入文件时遇到了一些问题。

当我运行这样的命令时,存储过程都是按顺序调用的(我假设的)还是它们可以并行运行?

我将第一个调用移到一个单独的步骤中。所以它会在第一步运行它,然后在第二步交付。最终测试会告诉我它是否有效,但我很好奇这些存储过程是否可以相互并行运行?如果是这样,那将解释我们的问题。

【问题讨论】:

  • 创建一个普通表...在第一步,截断表,然后用数据填充它...接下来的 3 步使用正确的数据....结束痛苦跨度>
  • 当我说临时表时,我指的是我删除并重新创建的表。但它是一个实际的表,而不是在 sproc 运行后不再存在的临时表。我打错了。
  • 不要删除表...只是在第一步中截断表...另外,请确保在存储过程中使用适当的隔离级别,也许您会得到一些脏读数...如果您遇到幻读或脏读,将隔离设置为可序列化应该可以解决问题

标签: sql-server tsql sql-server-2017 sql-agent


【解决方案1】:

在您的代码中:

exec fb_GetDateSource '6A0DA1EB-D349-4D97-AAFC-822343D8EB49';

exec fb_DeliverFile '2344EC77-0D34-44A9-8A10-E5FEA1F6F218';
exec fb_DeliverFile '0BF456B8-24E5-4B0E-8FDA-F31C2D397B3A';
exec fb_DeliverFile 'C42EA4AA-3179-4344-BE24-5CEBA435F4FD';

存储过程是串行执行的(一个接一个)。如果您想要并行性,您可以通过创建多个作业并从主作业启动它们来实现。

主作业:sp_start_job 将启动作业并将控制权返回给主程序。

EXEC msdb.dbo.sp_start_job @job_name=@MyJobName; -- job name 1
EXEC msdb.dbo.sp_start_job @job_name=@MyJobName; -- job name 2
EXEC msdb.dbo.sp_start_job @job_name=@MyJobName; -- job name 3
EXEC msdb.dbo.sp_start_job @job_name=@MyJobName; -- job name 4

或者,您可以使用Parallel Task 创建 SSIS 包并通过 SQL Server 代理运行此包。

【讨论】:

  • 我绝对不想要并行性,我试图避免它。我只是想确保它们连续运行。这回答了我的问题,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多