【问题标题】:SQL Server 2012 job schedulingSQL Server 2012 作业调度
【发布时间】:2023-03-07 09:40:01
【问题描述】:

我有一个包(包 A)大约需要 3 分钟才能完成,而另一个包(包 B)大约需要 4 分钟才能完成。我需要包 A 通过作业每 5 分钟运行一次,包 B 每 15 分钟运行一次。但是包 B 只能在包 A 完成后才能运行。

示例

5- 包 A 运行

10- 包 A 运行

15- 包 A 运行,然后包 B

20- 包 A 运行

25- 包 A 运行

30- 包 A 运行,然后包 B

有没有办法安排作业以满足上述要求?

非常感谢您的帮助。提前致谢!

【问题讨论】:

  • 将第一个作业安排为包 A 在 5/10/20/25/35/40/50/55 运行,并安排第二个作业分两步运行:包 a 和包 b 运行在0/15/30/45 并强制它仅在包 a/步骤 1 成功后才移动到包 b/步骤 2。
  • 或者修改包A以在适当的时候运行包B作为最后一步。
  • A 从 02:15 开始,运行 3 分钟。 BA 于 02:18 结束后立即开始。 A 在 02:20 再次开始,而 B 仍在运行,但 B 很高兴与 A 一起运行到 02:22。对吗?
  • 是的,工作 B 可以在 02:22 之前与 A 一起工作。

标签: sql tsql sql-server-2012 ssms sql-server-agent


【解决方案1】:

对于包 B,我只需输入逻辑来检查包 A 是否已停止运行

等待脚本是

WHILE EXISTS (
SELECT
    *
FROM 
    msdb.dbo.sysjobs_view job
JOIN
    msdb.dbo.sysjobactivity activity
ON 
    job.job_id = activity.job_id
JOIN
    msdb.dbo.syssessions sess
ON
    sess.session_id = activity.session_id
JOIN
(
    SELECT
        MAX( agent_start_date ) AS max_agent_start_date
    FROM
        msdb.dbo.syssessions
) sess_max
ON
    sess.agent_start_date = sess_max.max_agent_start_date
WHERE 
    run_requested_date IS NOT NULL AND stop_execution_date IS NULL
    AND job.name = 'package A') 
BEGIN 
WAITFOR DELAY '00:00:30'; 
END 

这将每 30 秒检查一次包 A 是否已停止运行。

或者,您可以创建一个表来跟踪作业状态,并对其进行 A 写入以跟踪状态。

【讨论】:

  • 您知道用于跟踪状态的表的脚本是什么样的吗?
  • 是的,创建表 dbo.tracking (job_status, job_title,job_id,
  • create table dbo.tracking ( job_id IDENTITY(1,1) ,job_title varchar(30) ,job_status bit ,job_time_start datetime ,job_time_end datetime ) --at the start of your Job a you would set the status to 1 and at the end set it to 0 -- at the start of your job b you would do the following WHILE EXISTS ( SELECT * FROM tracking WHERE job_id = 1 and job_status = 1 ) BEGIN WAITFOR DELAY '00:00:30'; END
  • 非常感谢。欣赏它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多