这是一个很容易自己测试的方法。在下文中,我通过一个步骤创建了一个 SQL 代理作业,如果 tempdb 中的表不存在,它会在该表中创建。
然后在插入当前时间戳之前等待 90 秒。但是,它计划每分钟运行一次。
USE [msdb]
GO
DECLARE @jobId binary(16)
EXEC msdb.dbo.sp_add_job
@job_name = N'Overlapping Execution'
, @enabled = 1
, @notify_level_eventlog = 0
, @notify_level_email = 2
, @notify_level_netsend = 2
, @notify_level_page = 2
, @delete_level = 0
, @category_name = N'[Uncategorized (Local)]'
, @job_id = @jobId OUTPUT
SELECT
@jobId
GO
EXEC msdb.dbo.sp_add_jobserver
@job_name = N'Overlapping Execution'
, @server_name = N'localhost\DEV2014'
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'Overlapping Execution'
, @step_name = N'Insert into table'
, @step_id = 1
, @cmdexec_success_code = 0
, @on_success_action = 1
, @on_fail_action = 2
, @retry_attempts = 0
, @retry_interval = 0
, @os_run_priority = 0
, @subsystem = N'TSQL'
, @command = N'USE tempdb
GO
IF NOT EXISTS
(
SELECT * FROM sys.tables AS T WHERE T.name = ''WatchMe''
)
BEGIN
CREATE TABLE dbo.Watchme
(
StartTime datetime NOT NULL
);
END
GO
-- wait for 90 seconds to ensure overlap
WAITFOR DELAY ''00:01:30'';
-- Add a row so we can demonstrate activity
INSERT INTO
dbo.Watchme
(
StartTime
)
VALUES
(CURRENT_TIMESTAMP);
'
, @database_name = N'tempdb'
, @flags = 0
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_update_job
@job_name = N'Overlapping Execution'
, @enabled = 1
, @start_step_id = 1
, @notify_level_eventlog = 0
, @notify_level_email = 2
, @notify_level_netsend = 2
, @notify_level_page = 2
, @delete_level = 0
, @description = N''
, @category_name = N'[Uncategorized (Local)]'
, @notify_email_operator_name = N''
, @notify_netsend_operator_name = N''
, @notify_page_operator_name = N''
GO
USE [msdb]
GO
DECLARE @schedule_id int
EXEC msdb.dbo.sp_add_jobschedule
@job_name = N'Overlapping Execution'
, @name = N'EveryMinute'
, @enabled = 1
, @freq_type = 4
, @freq_interval = 1
, @freq_subday_type = 4
, @freq_subday_interval = 1
, @freq_relative_interval = 0
, @freq_recurrence_factor = 1
, @active_start_date = 20141023
, @active_end_date = 99991231
, @active_start_time = 0
, @active_end_time = 235959
, @schedule_id = @schedule_id OUTPUT
SELECT
@schedule_id
GO
那么,会发生什么?如果 SQL 代理已经在运行,它将不会启动该作业。如果您尝试手动运行它
作业“重叠执行”启动失败。
运行作业重叠执行的请求(来自用户 pity\dafool)被拒绝,因为该作业已根据用户 mr\T 的请求运行。 (Microsoft SQL Server,错误:22022)
相反,代理将跳过错过的启动,直到它能够真正启动。在这里你可以看到历史。 4点50分开始。错过了 4:51 的开始,因为它已经在运行但抓住了 4:52 的窗口。
如果我查询我的 watchme 表
SELECT
WM.*
FROM
dbo.WatchMe AS WM
ORDER BY
1
我可以看到,是的,我的插入时间大约是在作业开始后 90 秒。
StartTime
2014-10-23 16:51:30.277
2014-10-23 16:53:30.767
2014-10-23 16:55:30.790
2014-10-23 16:57:30.793
2014-10-23 16:59:30.870
直接回答问题
不,代理不会停止当前正在执行的作业来启动它的新实例。
打开包内的日志记录(我喜欢 SQL Server 并记录 OnPre/PostExecute、OnError、OnTaskFailed),您应该能够预测它在进程中的位置以及任何失败信息。