--> Title : 扩展存储过程master.dbo.xp_sqlagent_enum_jobs
/*要想得到 SQL Server Job的运行状态,需要用到一个微软未公开的一个扩展存储过程: master.dbo.xp_sqlagent_enum_jobs.
这个扩展存储过程用到一个叫做 “xpstar90.dll”的动态链接库文件。
xp_sqlagent_enum_jobs
我们在调用的时候,@is sysadmin=1,@job owner name可以随便给个字符串值。 @job id可有可无。例如,可以这样查询所有的作业状况:
*/
execute master.dbo.xp_sqlagent_enum_jobs 1,'sa'
--判断 SQL Server作业(Job)是否正在运行的代码。
-- 1. create temp table to save jobs status
create table #job_run_status
(
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 collate database_default null,
running int not null, -- bool
current_step int not null,
current_retry_attempt int not null,
job_state int not null
)
-- 2. get jobs status
insert into #job_run_status
execute master.dbo.xp_sqlagent_enum_jobs 1,'sa'
-- 3. get running jobs
select job_name = j.name ,s.*
from #job_run_status s
inner join msdb.dbo.sysjobs jon s.job_id = j.job_id
where s.running= 1 -- running = 1
-- get running jobs start_time and stop_time
declare @b datetime
set @b=CONVERT(char(10),getdate(),120)
select job_name = b.name, c.start_execution_date,
case when c.stop_execution_date is null then GETDATE() else stop_execution_date end as stop_execution_date
from #job_run_status a
inner join msdb.dbo.sysjobs b on a.job_id = b.job_id
inner join msdb.dbo.sysjobactivity c on b.job_id=c.job_id
where a.running = 1 and c.start_execution_date > @b
--查看Job是否在運行
Declare @Job_ID asUNIQUEIDENTIFIER
select @Job_ID =Job_IDfrom msdb.dbo.sysjobswhere name = 'Jobname'
Exec master..sp_MSget_jobstate @Job_ID
--返回值为 1 -正在运行
-- 4 -表示完成(成功或失败)
--查看執行的结果状态
select category = jc.name, category_id= jc.category_id, job_name= j.name,
job_enabled = j.enabled,
last_run_time = cast(js.last_run_dateas varchar(10))+ '-' + cast(js.last_run_timeas varchar(10)),
last_run_duration = js.last_run_duration,
last_run_status = js.last_run_outcome,
last_run_msg = js.last_outcome_message+ cast(nullif(js.last_run_outcome,1)as varchar(2)),
job_created = j.date_created,
job_modified = j.date_modified
from msdb.dbo.sysjobs j
inner join msdb.dbo.sysjobservers json j.job_id = js.job_id
inner join msdb.dbo.syscategories jcon j.category_id = jc.category_id
where j.enabled= 1 and js.last_run_outcomein (0,1,3,5)
0:Fail 1:Succ 3:Cancel 5:First run and jc.category_id not between 10 and 20
select step_id, run_status,run_date As rundate
from msdb.dbo.sysjobhistory a
inner join msdb.dbo.sysjobs bon a.job_id=b.job_id
where b.name='PCDBI'
order by run_date DESC,step_idAsc
/*
作业的执行状态run_status:
0 = 失败
1 = 成功
2 = 重试
3 = 取消
4 = 正在进行