xp_sqlagent_enum_jobs是微软未公开的存储过程,用于取得作业的相关信息,在自己进行调度处理多作业时,用它来判断作业的执行情况再合适不过了。
create table #help_job(
job_id uniqueidentifier not null,
last_run_date int not null,
last_run_time int not null,
next_run_date int not null,
next_run_time int not null,
next_run_schedule_id int not null,
requested_to_run int not null, -- bool
request_source int not null,
request_source_id sysname null,
running int not null, -- bool
current_step int not null,
current_retry_attempt int not null,
job_state int not null
)--判断作业是否正在运行
while @job_run_flag = 1
begin
--删除临时表信息
delete #help_job
--添加信息
insert into #help_job
execute master.dbo.xp_sqlagent_enum_jobs 1, 'sa'
if exists (select * from msdb.dbo.sysjobs a,#help_job b where a.job_id=b.job_id and a.name='job1' and b.job_state = 4 and b.request_source_id is null)
begin
set @job_run_flag = 0
end
else
begin
--延时一分钟
waitfor delay '000:01:00'
end
end
--执行其他作业
exec msdb.dbo.sp_start_job @job_name = 'job1'
--更新服务器状态
--update sys_server set updateflag = 0 where pid = @pid
set @job_run_flag = 1
b.request_source_id is null一定要加上,否则多次启动同一个作业的时候有可能报错。
我的存储过程,大家可以借鉴一下
create procedure proc_pmis_main
as
--更新准备
exec proc_pmis_updateready
--临时表
create table #help_job(
job_id uniqueidentifier not null,
last_run_date int not null,
last_run_time int not null,
next_run_date int not null,
next_run_time int not null,
next_run_schedule_id int not null,
requested_to_run int not null, -- bool
request_source int not null,
request_source_id sysname null,
running int not null, -- bool
current_step int not null,
current_retry_attempt int not null,
job_state int not null
)
--作业是否正在运行
--1:正在运行;0:未运行
declare @job_run_flag int
set @job_run_flag = 1
declare @pid int
--循环提取数据
declare area_cursor cursor for
select pid from sys_server where updateflag = 1 and useflag = 1 order by pid
open area_cursor
fetch next from area_cursor into @pid
while @@fetch_status =0
begin
--判断作业是否正在运行
while @job_run_flag = 1
begin
--删除临时表信息
delete #help_job
--添加信息
insert into #help_job
execute master.dbo.xp_sqlagent_enum_jobs 1, 'sa'
if exists (select * from msdb.dbo.sysjobs a,#help_job b where a.job_id=b.job_id and a.name='job_pmis_synch' and b.job_state = 4 and b.request_source_id is null)
begin
set @job_run_flag = 0
end
else
begin
--延时一分钟
waitfor delay '000:01:00'
end
end
--执行同步作业
exec msdb.dbo.sp_start_job @job_name = 'job_pmis_synch'
--更新服务器状态
--update sys_server set updateflag = 0 where pid = @pid
set @job_run_flag = 1
--print (@pid)
fetch next from area_cursor into @pid
end
close area_cursor
deallocate area_cursor
drop table #help_job
go
新闻热点
疑难解答