Microsoft SQL Server
Transact-SQL

Как проверить: работает ли в данный момент job?

Опубликовано: 31 окт 05
Рейтинг:

Автор: Prolog
Прислал: Prolog

Q.
Как проверить: работает ли в данный момент job?

A.
1-й способ.
Основан на расширенных хранимых процедурах, которые специально предназначены для определения параметров job'ов:

declare
  @job_id       uniqueidentifier,
  @owner        sysname,
  @is_sysadmin  int

select
  @job_id = job_id,
  @owner  = suser_sname(owner_sid)
from
  msdb.dbo.sysjobs
where
  name = 'MyJob'

create table #xp_results
(
  job_id                uniqueidentifier  null,
  last_run_date         int               null,
  last_run_time         int               null,
  next_run_date         int               null,
  next_run_time         int               null,
  next_run_schedule_id  int               null,
  requested_to_run      int               null,
  request_source        int               null,
  request_source_id     sysname           null,
  running               int               null,
  current_step          int               null,
  current_retry_attempt int               null,
  job_state             int               null
)

set @is_sysadmin = coalesce(is_srvrolemember(N'sysadmin'),0)

if ((@@microsoftversion / 0x01000000) >= 8) -- SQL Server 8.0 or greater
  insert into #xp_results execute master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @owner, @job_id
else
  insert into #xp_results execute master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @owner

if (select Running from #xp_results where job_id = @job_id) = 1
   print 'MyJob is running'
else
   print 'MyJob is stopped'

2-й способ.
Основан на том факте, что SQL Server Agent при выполнении того или иного job'а создает соединение с SQL сервером с именем приложения, в котором присутствует job_id из таблицы msdb.dbo.sysjobs.

declare
  @job_id  varbinary(36),
  @hex     varchar(36)

select
  @job_id = cast(job_id as varbinary(36))
from
  msdb.dbo.sysjobs
where
  name = 'MyJob'

execute master..xp_varbintohexstr @job_id,@hex output
if exists(select 1 from master..sysprocesses with (nolock) where charindex(@hex,program_name) <> 0)
   print 'MyJob is running'
else
   print 'MyJob is stopped'

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft SQL Server / Transact-SQL / Как проверить: работает ли в данный момент job?