SQL SERVER作业的计划(Schedules),如果你没仔细研究过或没有应用一些复杂的计划(Schedules),那么你觉得SQL SERVER作业的计划(Schedules)非常好用,也没啥问题,但是我要告诉你一个“残酷”的真相,相比Linux系统的Crontab,SQL SERVER作业的计划其实是一个二等残废,很多功能要实行起来真的是让人头疼!

如果你自认为非常了解作业的配置(不要想当然,实践验证保证会让你大吃一惊)?那么接下来先看看几个问题:

1:如果你要配置作业在每个小时的第20分钟执行,例如1:20、2:20、3:20........执行,你怎么配置?

2:在计划(Schedules)里面,如果执行间隔为“小时”,那么取值必须为整数吗? 可以为2.5个小时吗?

3:在计划(Schedules)里面,如果我要设置执行间隔为90分钟计划,这样能行吗?

4:如果我想在计划(Schedules)外,多执行一次作业,如何执行? 执行了后,是否影响作业的计划Schedules?

5: 修改系统时间,是否会影响作业的Schedule?

1:如果你要配置作业在每个小时的第20分钟执行,例如1:20、2:20、3:20........执行,你怎么配置?

对于问题1这种类似的问题,如果你遇到过而且解决过这类问题,那么其实很简单,你只需要设置开始时间为0:20即可,否则无法实现。至于SQL SERVER为什么要这么蛋疼的设置,应该是执行间隔有一个参照时间点(第一次执行的时间点),你设置开始开始时间为0:20,即表示这个时间点作为第一次执行的参照点。

2:在计划(Schedules)里面,如果执行间隔为“小时”,那么取值必须为整数吗? 可以为2.5个小时吗?

关于问题2,答案是执行间隔是不能设成小数的,只能为整数,只能为1,2,3。。。。如果你将其值设置为一个小数,则当你点击确定按钮后,它会自动四舍五入变成一个整数,例如,你输入1.3 ,你点击确定后,再打开,你会发现其值变为1了,如果是1.6,则会变成2,不信的话,你可以试试。对于秒、分钟都是如此。为什么如此呢,答案在于系统表msdb.dbo.sysschedules,不明白可以看文章最后。

3:在计划(Schedules)里面,如果我要设置执行间隔为90分钟计划,这样能行吗?

如果没有实践过的人,肯定会信誓旦旦的说,那肯定可以啊。答案是设置执行间隔不能超过61,否则当你点击确认的时候,系统自动会将其设为60,至于原因,我暂时没有想明白,微软这个限定,感觉真蛋疼。如果真有需求需要90分钟执行一次,那怎么办? 纠结了把。

方法1: 将作业J拆分成两个一模一样的作业J1 和J2,然后设置其Schedules为3小时执行一次,两个作业错开执行,刚好能满足业务需求。不过想想都觉得麻烦!

方法2: 作业Schedule执行时间间隔90分钟的实现方式是通过下面方式实现的:其实是将Schedule时间设为30分钟执行一次,然后再代码里面按其规律,达到90分钟才真正执行业务逻辑SQL代码。

2.1 从0:00(服务器时间)开始,作业Schedule的频率为30分钟一次,实际上只需要执行下面时间点(实际执行时间90分钟),按规律可以分成两种:

整点执行的(0:00, 1:00, 2:00, 3:00…..) 只有当Hour %3 = 0 时才执行存储过程。

非整点执行的(0:30, 1:30, 2:30 ……......) 只有当Hour % 3= 1时才执行存储过程。

2.2 从0:30(服务器时间)开始,作业Schedule的频率为30分钟一次,实际上只需要执行下面时间点,按规律也可以分成两种。

整点执行的(0:00, 1:00, 2:00, 3:00…..) 只有当Hour %3 = 2 时才执行存储过程。

非整点执行的(0:30, 1:30, 2:30 …….......) 只有当Hour % 3= 0时才执行存储过程。

DECLARE @Hours   INT;

DECLARE @Minute    INT;

SELECT @Hours =CAST(SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),11,3) AS INT);

SELECT @Minute=CAST(SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),15,2) AS INT);

IF @Minute = 30 AND @Hours%3 = 0

BEGIN 

       INSERT INTO BI_JOB_LOG   --暂时记录执行时间

       SELECT GETDATE();

        --执行业务逻辑代码

        ...........................

END;

IF @Minute = 0 AND  @Hours%3=2

BEGIN

       INSERT INTO BI_JOB_LOG

       SELECT GETDATE();

        --执行业务逻辑代码

        ...........................

END;

4:如果我想在计划(Schedules)外,多执行一次作业,如何执行? 执行了后,是否影响作业的计划Schedules?

如下图所示,我建立一个测试作业test,每隔13分钟执行一次,在21:57, 21:58我分别手动执行了该作业两次,但是丝毫不影响该作业的调度计划。在22:06分钟还是准时执行了。

要查看作业下次执行时间,可以通过SELECT * FROM msdb.dbo.sysjobschedules 来查看。

5: 修改系统时间,是否会影响作业的Schedule?

答案是会影响,一般要么重建该作业的调度计划或禁用作业的调度,再启用该调度来解决。有兴趣的可以自己试验一下,这里不做过多介绍。

SQL SERVER数据库作业的 Schedule 信息一般位于表 msdb.dbo.sysschedules,如下所示

包含有关 SQL Server 代理作业计划的信息。此表存储在 msdb 数据库中。其实看其参数的数据类型,你就知道第二个问题的答案了。呵呵

列名

数据类型

说明

schedule_id

int

SQL Server 代理作业计划 ID。

schedule_uid

uniqueidentifier

作业计划的唯一标识符。此值用于标识分布式作业的计划。

originating_server_id

int

作为作业计划来源的主服务器 ID。

name

sysname (nvarchar(128))

作业计划的用户定义名称。该名称在作业中必须唯一。

owner_sid

varbinary(85)

拥有作业计划的用户或用户组的 Microsoft Windows security_identifier

enabled

int

作业计划的状态:

0 = 未启用。

1 = 启用。

如果未启用计划,则不会运行该计划中的任何作业。

freq_type

int

此计划中作业运行的频率。

1 = 只运行一次

4 = 每天

8 = 每周

16 = 每月

32 = 每月,与 freq_interval 有关

64 = 在 SQL Server 代理服务启动时运行

128 = 在计算机空闲时运行

freq_interval

int

执行作业的间隔天数。该值取決于 freq_type 的值。默认值为 0,表示不使用 freq_interval

freq_type 的值

对 freq_interval 的影响

1(一次)

不使用 freq_interval (0)

4(每天)

freq_interval

8(每周)

freq_interval 为下列一个或多个值:

1 = 星期日

2 = 星期一

4 = 星期二

8 = 星期三

16 = 星期四

32 = 星期五

64 = 星期六

16(每月)

每月的 freq_interval

32(与“每月”选项相关)

freq_interval 为下列值之一:

1 = 星期日

2 = 星期一

3 = 星期二

4 = 星期三

5 = 星期四

6 = 星期五

7 = 星期六

8 = 日

9 = 工作日

10 = 休息日

64 (在 SQL Server 代理服务启动时开始)

不使用 freq_interval (0)

128(在计算机空闲时运行)

不使用 freq_interval (0)

freq_subday_type

int

freq_subday_interval 的单位。可以是下列值之一:

说明(单位)

1

在指定的时间

2

4

分钟

8

小时

freq_subday_interval

int

在每次执行作业之间发生的 freq_subday_type 的周期数。

freq_relative_interval

int

如果 freq_interval32(与“每月”选项相关),则为每月中 freq_interval 发生的时间。可以是下列值之一:

0 = 不使用 freq_relative_interval

1 = 第一次

2 = 第二次

4 = 第三次

8 = 第四次

16 = 最后一次

freq_recurrence_

factor

int

已计划执行的作业之间的周数或月数。仅当 freq_type81632 时,才使用 freq_recurrence_factor。如果此列包含 0,则不使用 freq_recurrence_factor

active_start_date

int

可以开始执行作业的日期。日期格式为 YYYYMMDD。NULL 表示当天的日期。

active_end_date

int

可以停止执行作业的日期。日期格式为 YYYYMMDD。

active_start_time

int

active_start_dateactive_end_date 之间的任意日期开始执行作业的时间。时间格式为 HHMMSS,采用 24 小时制。

active_end_time

int

active_start_dateactive_end_date 之间的任意日期停止执行作业的时间。时间格式为 HHMMSS,采用 24 小时制。

date_created

datetime

创建计划的日期和时间。

date_modified

datetime

上次修改计划的日期和时间。

version_number

int

计划的当前版本号。例如,如果计划已修改 10 次,则 version_number 为 10。

SQL SERVER作业的Schedules浅析的更多相关文章

  1. SQL Server 作业监控

    原文:SQL Server 作业监控 在讲解SQLServer Agent Jobs之前,先要讲解msdb. Msdb是SQLServer的系统数据库之一,用于存储SQLServer的配置.元数据等信 ...

  2. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  3. 【解决】SQL Server作业中Excel Application不能访问文件

    在通过SQL Server作业来实现定时任务时,出现如下错误: FullyQualifiedErrorId : ComMethodTargetInvocation使用“1”个参数调用“Add”时发生异 ...

  4. SQL Server作业没有执行的解决方法

    SQL Server作业没有执行的解决方法  确保SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行    设置方法:  我的电脑--控制面板--管理工具--服务--右键 SQLSE ...

  5. SQL SERVER 作业问题(SET 选项的设置不正确: 'QUOTED_IDENTIFIER'。),以及其它定时sql执行方式探索

    在实时曲线测试平台中,需要用到实时测试数据作为依据,评估程序的可靠性.在编写sql server作业时,出现了一些问题,经过研究给予解决,供大家参考. 1.编写脚本如下: declare @i int ...

  6. SQL SERVER 作业浅析

    作业介绍 SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Activ ...

  7. 使用SQL Server作业设置定时任务

    1.开启SQL Server Agent服务 使用作业需要SQL Agent服务的支持,并且需要设置为自动启动,否则你的作业不会被执行. 以下步骤开启服务:开始-->>>运行--&g ...

  8. SQL SERVER 作业(或叫执行计划)

    如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现. 1.管理->SQL S ...

  9. SSIS结合BCP及SQL Server作业实现定时将数据导出打包实现数据同步

    首先这个流程要实现的功能大致是: 有两台服务器,一台是对外网开发的,一台是内网的.那么很明显数据交互都是外网服务器在做,而这个流程要做的就是要将外网上面的数据定时同步到内网中. 我们依对其中某张表的操 ...

随机推荐

  1. 使用Free Spire.XLS插入图表

    使用Free Spire.XLS插入图表 前言 最近在研究Office中间件,上网搜索了下,比较出名的有两个:Aspose和Spire,两者功能齐全,对Office的支持趋近完善,但售价不菲.仔细搜索 ...

  2. DB2 Enterprise Server Edition(DB2 ESE)9.1在Windows Server 2008 下出现无法新建数据库的情况,及解决办法

    在安装有,DB2 9.1版本的Windows Server 2008 上面,使用默认的安装方式导致无法创建数据库,相关的错误提示: "SQL3012C 发生系统错误(原因码= "& ...

  3. WebApi Controller 分类

    前言 写这篇WebApi Controller分类一是把Contrller分类的解决方法说一说,再顺便把遇到的问题和解决方法聊一聊. 说实话第一次在项目中使用WebApi感觉非常的不顺手. 遇到的问题 ...

  4. 我的angularjs源码学习之旅1——初识angularjs

    angular诞生有好几年光景了,有Google公司的支持版本更新还是比较快,从一开始就是一个热门技术,但是本人近期才开始接触到.只能感慨自己学习起点有点晚了.只能是加倍努力赶上技术前线. 因为有分析 ...

  5. 实际案例:在现有代码中通过async/await实现并行

    一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇“黑色30秒”问题的过程中,切身体会到了异步的巨大作用 ...

  6. Xamarin.Android和UWP之MVVM的简单使用(二)

    0x01 前言 前面一篇,Xamarin.Android和UWP之MVVM的简单使用(一),主要讲了MvvmLight的简单使用 这篇主要讲讲MvvmCross的简单使用,例子的话,还是和上篇的一样. ...

  7. const 和 readonly

    const 和 readonly 的异同 Const readonly 字面意 不变常量,不可修改 只读操作,不可写 初始化 必须在声明的同时赋值 可在声明和构造方法中进行赋值 所属关系 类.即sta ...

  8. Windows Server 2012 R2在线安装.NET Framework3.5

    Windows Server 2012 (R2) 默认没有安装 .NET Framework 3.5,但可以通过在线安装或指定备用源路径方式. 之前在这个 在Win Server 2012中安装.NE ...

  9. 【C#】委托-Delegate

    C# 委托(Delegate) C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变. 委托 ...

  10. Guava学习-缓存

    Guava的缓存是本地缓存,所以我觉得在使用场景上适合那种并非是高一致性的场景中,而且他的实现和ConcurrentHashMap很类似.但是毕竟是缓存嘛,肯定有自动清除的功能.外加一些什么清除策略等 ...