如何获取触发Microsoft SQL Server Agent作业的调度类型
解决方案
方法一:通过SQL Server Agent系统表获取触发调度类型
SQL Server的msdb数据库存储了所有Agent作业与调度的元数据,可在作业执行的SQL步骤中,查询当前运行实例对应的调度信息,以此判断调度类型。
步骤1:获取当前作业的运行上下文信息
在作业的SQL执行步骤中,先获取当前作业ID及对应调度ID:
DECLARE @JobID UNIQUEIDENTIFIER, @ScheduleID INT; -- 获取当前正在运行的作业ID SELECT @JobID = job_id FROM msdb.dbo.sysjobactivity WHERE session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) AND start_execution_date IS NOT NULL AND stop_execution_date IS NULL; -- 获取当前作业对应的触发调度ID SELECT @ScheduleID = schedule_id FROM msdb.dbo.sysjobhistory WHERE job_id = @JobID AND instance_id = (SELECT MAX(instance_id) FROM msdb.dbo.sysjobhistory WHERE job_id = @JobID);
步骤2:判断调度类型并写入标记
根据调度ID查询调度详情,判断是周调度还是月调度,再在数据插入时填入对应标记:
DECLARE @ScheduleType VARCHAR(20); SELECT @ScheduleType = CASE WHEN s.freq_type = 8 -- 每周调度 AND s.freq_interval = 6 -- 周五(1=周日,2=周一...6=周五) THEN 'End of week' WHEN s.freq_type = 16 -- 每月调度 AND s.freq_interval = -1 -- 每月最后一天 THEN 'End of month' ELSE 'Unknown' END FROM msdb.dbo.sysschedules s JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id WHERE js.job_id = @JobID AND s.schedule_id = @ScheduleID; -- 执行数据复制并写入调度标记 INSERT INTO 目标表(列1, 列2, schedule) SELECT 源列1, 源列2, @ScheduleType FROM 源表;
方法二:拆分作业步骤绑定对应调度(更直观)
若作业逻辑允许,可将数据复制拆分为两个独立作业步骤,分别绑定不同调度:
- 新建作业步骤A,仅绑定每周五的调度,插入数据时直接指定
schedule = 'End of week' - 新建作业步骤B,仅绑定每月最后一天的调度,插入数据时直接指定
schedule = 'End of month'
此方法无需额外判断,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Christoph Larisch
相关产品推荐
相关产品推荐

