如何让每日7点运行的SQL Server Agent作业每月10-12日不执行?
替代手动修改SQL Server Agent作业计划的最优方案
当然有更优雅的方法来替代你手动调整计划的操作!这里有几个实用的方案,你可以根据自己的SQL Server版本和使用习惯选择:
方案一:在作业中添加前置判断步骤(推荐,适配所有版本)
这个方法不需要修改作业计划,而是在作业执行前先判断当前日期是否属于每月10-12日,如果是就自动跳过后续步骤,非常灵活:
- 打开SQL Server Management Studio,找到你的目标作业,右键选择属性
- 切换到步骤选项卡,点击新建添加一个前置步骤
- 步骤类型选择
Transact-SQL (T-SQL),在命令框中输入以下代码:
-- 判断当前日期是否为每月10、11、12日 IF DATEPART(DAY, GETDATE()) IN (10, 11, 12) BEGIN -- 输出跳过提示,返回成功状态避免作业标记为失败 PRINT '今日为每月10-12日,作业将跳过执行'; RETURN 0; END
- 将这个新步骤拖到所有步骤的最上方,设置它的执行逻辑:
- 成功时的操作:选择转到下一步骤(让后续步骤在非跳过日期正常执行)
- 失败时的操作:选择退出报告成功(即使判断步骤出错,也不标记作业失败)
- 保存作业设置即可
之后每天晚7点作业会正常触发,但10-12日时,前置步骤会直接退出,后续业务步骤不会执行,完全不需要手动干预。
方案二:利用作业计划的原生日期筛选功能(适合SQL Server 2008及以上)
如果你更倾向于通过计划本身来控制执行日期,可以创建一个覆盖非10-12日的计划:
- 打开作业的计划选项卡,点击新建创建一个新计划
- 在频率选项卡中:
- 频率类型选择每月
- 选择每月的这些日期,然后输入日期列表:
1,2,3,4,5,6,7,8,9,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 - 重复间隔设置为1个月
- 在每日频率选项卡中,设置执行时间为晚上7点,执行一次
- 保存计划后,禁用原来的每日计划即可
SQL Server Agent会自动处理不存在的日期(比如30天的月份跳过31日,2月自动适配闰年),这样每月1-9日和13-31日都会在晚7点正常执行,10-12日自动跳过。
方案三:自动化修改计划(不推荐,仅作补充)
如果你坚持想沿用类似手动修改的逻辑但实现自动化,可以创建一个辅助作业来自动调整计划:
- 创建一个新的代理作业,添加两个T-SQL步骤:
- 步骤1(每月9日晚8点执行):修改原计划的开始日期为13日
UPDATE msdb.dbo.sysschedules SET active_start_date = CONVERT(VARCHAR(8), DATEADD(DAY, 4, GETDATE()), 112) -- 9日+4天=13日 WHERE name = '你的原计划名称' - 步骤2(每月12日晚8点执行):修改原计划的开始日期为次月1日
DECLARE @nextMonthFirstDay DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0) UPDATE msdb.dbo.sysschedules SET active_start_date = CONVERT(VARCHAR(8), @nextMonthFirstDay, 112) WHERE name = '你的原计划名称'
- 步骤1(每月9日晚8点执行):修改原计划的开始日期为13日
- 给这个辅助作业设置两个计划:一个每月9日晚8点执行,一个每月12日晚8点执行
不过这个方案需要维护额外的作业,且直接修改系统表有一定风险,所以优先推荐前两个方案。
内容的提问来源于stack exchange,提问作者Pintu Kawar
相关产品推荐
相关产品推荐

