在SQL Server上安排某个月的作业

时间:2014-02-24 13:57:14

标签: sql sql-server

我希望在我的SQL Server上安排一份工作,每年1月到6月每天运行三次(上午8点,下午1点和下午7点),并且每月运行一次相同的工作这一年。

我试图找到答案,所以我没有成功。任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

(评论已基本解决了这个问题。我正在将他们的见解转化为官方答案。)

内置的调度程序非常复杂。它不支持相同的时间表,具体取决于一年中的时间。但是,它确实允许多个计划,您可以在SQL语句中执行自己的计划逻辑。

如果您不介意每年调整作业计划,可以通过设置4个单独的计划来避免在SQL语句中使用任何自定义计划逻辑。您可以将前3个时间表设置为每天发生一次,每1天一次,在相关时间(上午8点,下午1点或下午7点)发生一次。您将为2014年6月30日的那些时间表设置结束日期。然后,您将创建另一个时间表,该时间表按月发生,在您希望的每个月的任何一天,每1个月,在您想要的任何时间。您可以将该时间表的开始日期设置为2014年7月1日,并将结束日期指定为2014年12月31日。

如上所述,这种方法存在很大的缺点;您必须每年更改计划,因为当前年份已硬编码到计划中。 (如果需要,您可以提前随时添加下一年的时间表 - 即使是几年 - 您可以将旧时间表保留到结束日期之后。)但是,该方法有两个优点。首先,您不必在SQL中编写任何调度逻辑,这更有可能存在错误,并且会隐藏来自不经意的观察者的调度现实。其次,工作只会在应该开始时触发,因此您的工作历史仅显示那些重要的执行。 (如果您正在SQL中执行调度逻辑,那么您可以更频繁地解决这个问题,让它被SQL调度逻辑压制,但也会使工作历史变得混乱。)第三个小优势是避免非常小的性能命中所有额外的作业执行和SQL调度逻辑评估。

如果您对在作业的SQL语句中使用某些调度逻辑感兴趣,而不是制作大量特定定义的调度,则可以创建一个每天每小时触发一次的调度。然后,您将现有的SQL语句包装在逻辑中,如下所示:

DECLARE @TestDate datetime, @ExecuteSQL bit;
SELECT @TestDate = getdate(), @ExecuteSQL = 0;

-- Uncomment each of these lines (one at a time) to test the logic with various dates.
--SET @TestDate = '2014-07-02 8:00 AM';
--SET @TestDate = '2014-07-01 8:00 AM';
--SET @TestDate = '2014-07-01 9:00 AM';
--SET @TestDate = '2014-06-01 9:00 AM';
--SET @TestDate = '2014-06-02 1:00 PM';
--SET @TestDate = '2014-06-02 6:03 PM';
--SET @TestDate = '2014-06-02 7:03 PM';

SET @ExecuteSQL = 
    CASE
        WHEN
            -- it's between January and June and it's in the 8 AM, 1 PM, or 7 PM hours
            (
                DATEPART(m,@TestDate) BETWEEN 1 AND 6
            AND
                DATEPART(hh,@TestDate) IN (8,13,19)
            )
        OR
            -- it's not between January and June, but it's the first of the month during the 8 AM hour
            (
                DATEPART(m,@TestDate) NOT BETWEEN 1 AND 6
            AND
                DATEPART(d,@TestDate) = 1
            AND
                DATEPART(hh,@TestDate) IN (8)
            )
        THEN
            1
        ELSE
            0
    END;

IF @ExecuteSQL <> 0
BEGIN
    SELECT 'Do Fun Stuff Here';
END
ELSE
BEGIN
    SELECT 'You would probably omit this ELSE, but it is maintained for demonstration purposes.';
END