You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:40:31