jerrynet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

假设一个作业每隔1分钟执行一次,如果这个作业的执行时间需要1分零10秒,结果会怎么样呢?

下面就让我们来做个测试,看下会发生什么。

 

 

-- 创建测试表
Use TempDB
GO
CREATE TABLE [dbo].[TestJob](
[id] [int] IDENTITY(1,1) NOT NULL,
[datetime] [datetime] NULL,
[memo] [varchar](50) NULL
)
ON [PRIMARY]

GO

-- 创建测试作业
USE [msdb]
GO
/****** 对象: Job [test] 脚本日期: 11/05/2009 17:38:31 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** 对象: JobCategory [[Uncategorized (Local)]]] 脚本日期: 11/05/2009 17:38:31 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'test',
@enabled=0,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'sss',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'HostName\Administrator', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** 对象: Step [1] 脚本日期: 11/05/2009 17:38:32 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'1',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'insert into TestJob([datetime],memo)
values(getdate(),
''11'')

waitfor delay
''00:01:10''',
@database_name=N'TempDB',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'1',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=4,
@freq_subday_interval=1,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20091105,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

 

创建好测试的环境,我们“Enable”下作业,然后观察结果。

-- 主要测试结果

select *

from TestJob

 

/*

id          datetime                         memo

----------- ------------------ -----------------------------

4           2009-11-05 17:29:00.230 11

5           2009-11-05 17:31:00.217 11

6           2009-11-05 17:33:00.230 11

 

(3 行受影响)

*/

 

从结果中可以看出,17:30 和 17:32这两次属于在作业的调度范围里面,但是实际的测试表中并没有插入测试数据,作业没有执行的。

因此大家在调度作业的时候,要注意作业本身执行时间的问题。

 

posted on 2010-09-25 13:27  Jerrynet  阅读(386)  评论(0编辑  收藏  举报