MSSQL通过扩展存储过程 master.dbo.xp_sqlagent_enum_jobs获取正在执行的job

--> 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 =
正在进行

*/

你可能感兴趣的:(SQL,SERVER)