在 SQL Server 中,任务调度通常涉及使用 SQL Server Agent。SQL Server Agent 是一个强大的工具,用于自动执行作业(Jobs)、操作(Operators)、警告(Alerts)和多种类型的任务。以下是使用 SQL Server Agent 进行任务调度的基本步骤:
1. 启用 SQL Server Agent
首先,确保 SQL Server Agent 已经启动。你可以通过 SQL Server Management Studio (SSMS) 来检查和启动它:
在 SSMS 中,连接到你的 SQL Server 实例。
在“对象资源管理器”中,展开“SQL Server Agent”。
右键点击“SQL Server Agent”,选择“启动”。
2. 创建作业
作业等SQL Server 代理参数,可参考https://learn.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-add-job-transact-sql?view=sql-server-ver16 。
作业是 SQL Server Agent 中用于执行一系列任务的基本单元。你可以通过以下步骤创建一个作业:
在 SSMS 中,展开“SQL Server Agent”,右键点击“作业”,选择“新建作业”。
在“常规”页面中,输入作业的名称和描述。
在“步骤”页面中,可以添加新的作业步骤。每个步骤可以执行一个 Transact-SQL 脚本、命令行脚本或其他类型的任务。点击“新建”来添加一个步骤,设置其类型、名称、数据库和要执行的命令或脚本。
在“调度”页面中,可以设置作业的调度计划,如频率、开始时间和持续时间。
点击“确定”保存作业。
创建作业,T-SQL语句如下:
-- 创建作业
EXEC msdb.dbo.sp_add_job
@job_name = N'MyJob';
2. 创建作业步骤
创建作业步骤语句:
-- 添加作业步骤
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'MyJob',
@step_name = N'MyJobStep',
@subsystem = N'TSQL',
@command = N'PRINT ''Hello, World!''';
3. 配置作业的调度计划
在创建或编辑作业时,你可以设置其调度计划:
频率:可以设置为一次性的、每天、每周、每月等。
重复间隔:例如,每天、每周的哪一天等。
开始时间:作业开始的具体时间。
持续时间:作业运行的时间长度。
T-SQL 语句如下:
1 -- 设置作业调度
2 EXEC msdb.dbo.sp_add_jobschedule
3 @job_name = N'MyJob',
4 @name = N'DailySchedule',
5 @freq_type = 4, -- 按日执行
6 @freq_interval = 1, -- 一次
7 @freq_subday_type = 4, -- 执行周期(分钟)
8 @freq_subday_interval = 1, -- 每个执行周期执行次数(一次)
9 @active_start_date = 20250219, -- 开始日期2025-02-19
10 @active_end_date = 99991231, -- 结束日期99991231
11 @active_start_time = 0, -- 开始时间
12 @active_end_time = 235959 -- 结束时间
设置作业调度的参数含义:
参数说明
@job_id
添加计划作业的作业标识号。类型uniqueidentifier, 默认值NULL
必须指定@job_id或@job_name,但不能同时指定这两者
@job_name
向其中添加计划的作业的名称。 @job_name为 sysname,默认值为 NULL.
必须指定@job_id或@job_name,但不能同时指定这两者
@name
计划名称
@enabled
指示计划的当前状态。 @enabled 为 tinyint,默认值 1 为 (已启用)。 如果 0启用计划,则不会启用该计划。 禁用计划后,不会运行作业。
@freq_type
指示作业执行时间的值。 @freq_type为 int,可以是以下值之一:
1 一次
4 每日
8 每周
16 每月
32 相对于@freq_interval的每月
64 SQL Server 代理服务启动时运行。
128 在计算机空闲时运行。
@freq_interval
执行作业的日期。 @freq_interval为 int,默认值0为 int,取决于@freq_type的值 。
@freq_subday_type
指定@freq_subday_interval的单位。 @freq_subday_type为 int,可以是以下值之一:
1 在指定的时间
2 秒
4 分钟
8 时数
@freq_subday_interval
每个作业执行之间要发生的@freq_subday_type周期数。 @freq_subday_interval为 int,默认值为 0
@freq_relative_interval
进一步定义@freq_type设置为32(每月相对)时的@freq_interval。@freq_relative_interval为 int,可以是以下值之一:
1 第一个
2 第二个
4 第三个
8 第4个
16 Last
@freq_relative_interval指示间隔的发生。 例如,如果@freq_relative_interval设置为2@freq_type设置为32,并且@freq_interval设置为3,则计划作业将在每月的第二个星期二发生。
@freq_recurrence_factor
作业执行计划之间相隔的周数或月数。 @freq_recurrence_factor为 int,默认值为 0. 仅当@freq_type设置为8或16@freq_recurrence_factor32时,才使用@freq_recurrence_factor。
@active_start_date
作业执行可以开始的日期。 @active_start_date为 int,默认值为 NULL. 日期的格式为 yyyyMMdd。 如果 设置了@active_start_date ,则日期必须大于或等于 19900101。
@active_end_date
作业执行可以停止的日期。 @active_end_date为 int,默认值为 99991231. 日期的格式为 yyyyMMdd
@active_start_time
@active_start_date和@active_end_date之间任意一天开始执行作业的时间。 @active_start_time为 int,默认值为 000000. 时间的格式设置为 HHmmss 24 小时制。
@active_end_time
active_start_date和@active_end_date之间任意一天结束作业执行的时间。 @active_end_time为 int,默认值为 235959. 时间的格式设置为 HHmmss 24 小时制。
@schedule_id
如果成功创建计划,则为其分配的计划标识号。 @schedule_id是 int 类型的 OUTPUT 参数。
@automatic_post
标识为仅供参考。 不支持。 不保证以后的兼容性。
@schedule_uid
计划的唯一标识符。 @schedule_uid是 uniqueidentifier 类型的 OUTPUT 参数
@freq_type和@freq_interval的值如下:
freq_type的值对 @freq_interval的影响
1 (一次)
@freq_interval未使用。
4 (每日)
每 @freq_interval 天。
8 (每周)
@freq_interval 是以下一个或多个(与逻辑运算符结合使用 OR ):
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未使用。
128
@freq_interval未使用。
4. 设置目标服务器。
T-SQL 创建作业时不能指定目标服务器。所以,我们需要右击【SQL Server代理服务】→【作业】→【属性】,切换到目“目标”。选择或主配置合适的服务器。
其他功能
监控作业
创建并调度作业后,你可以监控其执行情况:
在 SSMS 中,展开“SQL Server Agent”,选择“作业活动监视器”或“作业历史”。
“作业活动监视器”显示当前正在运行的作业。
“作业历史”显示过去所有作业的运行历史,包括成功和失败的情况。
查看历史作业语句:
-- 查看作业历史记录
SELECT * FROM msdb.dbo.sysjobhistory WHERE job_id = (SELECT job_id FROM msdb.dbo.sysjobs WHERE name = N'MyJob');
管理作业
你可以随时修改、启用或禁用作业,或者删除不再需要的作业:
在 SSMS 中,右键点击需要管理的作业,选择相应的操作(如“编辑”、“启动”、“停止”或“删除”)。通过以上步骤,你可以有效地使用 SQL Server Agent 来管理和调度你的数据库任务。这对于自动化日常维护任务、数据备份和报告生成等场景非常有用。
首先,确保 SQL Server Agent 已经启动。你可以通过 SQL Server Management Studio (SSMS) 来检查和启动它:
在 SSMS 中,连接到你的 SQL Server 实例。
在“对象资源管理器”中,展开“SQL Server Agent”。
右键点击“SQL Server Agent”,选择“启动”。
1 -- 删除作业步骤
2 EXEC msdb.dbo.sp_delete_jobstep @job_name = N'MyJob', @step_id = 1;
3
4 -- 删除作业调度
5 EXEC msdb.dbo.sp_delete_jobschedule @job_name = N'MyJob', @name = N'DailySchedule';
6
7 -- 删除作业
8 EXEC msdb.dbo.sp_delete_job @job_name = N'MyJob';