2009-10-28 2 views
0

У меня есть задание SQL Server, которое вызывает 10 других заданий, используя sp_start_job. Задача состоит из 10 шагов, каждый шаг снова вызывает вспомогательные задания.SQL Agent Job - выполнить в качестве очереди

Когда я выполняю основное задание, я вижу, что это началось с шага 1, и через несколько секунд он показывает «Готово успешно».

Но для выполнения заданий требуется много времени, и когда я проверяю информацию о регистрации, он показывает, что все 10 шагов выполняются одновременно на задней панели, пока она не закончится через несколько часов.

Мое требование состоит в том, что он должен завершить первый шаг 1, и только тогда должен начаться этап2.

ответ

1

В форуме Microsoft Code есть возможность проверить, работает ли хранимая процедура. Вы могли бы использовать, чтобы ждать, пока работа не будет завершена:

while 1=1 
    begin 
    WAITFOR DELAY '000:00:10' 

    if not exists (
     SELECT * 
     FROM master..sysprocesses p 
     JOIN msdb..sysjobs j ON 
      substring(left(j.job_id,8),7,2) + 
      substring(left(j.job_id,8),5,2) + 
      substring(left(j.job_id,8),3,2) + 
      substring(left(j.job_id,8),1,2) = 
      substring(p.program_name,32,8) 
     WHERE j.name = 'YourJobName' 
     AND program_name like 'SQLAgent - TSQL JobStep (Job %' 
    ) 
     break 
    end 

Таким образом, код работает так, что он ожидает в течение 10 секунд, а затем проверяет, если задание YourJobName работает. Он повторяет это, пока работа больше не работает. Вы можете установить это между вызовами sp_start_job.

Сказав это, должен быть более простой способ. Не можете ли вы сохранить код для каждого из 10 заданий в хранимой процедуре? «Мастер» может вызывать 10 хранимых процедур, а не запускать 10 заданий.

0

Мой первый ответ был, что вы могли бы использовать цикл, как указано выше, но проверить таблицы истории работы в MSDB ждать предшествующая работа, чтобы закончить:

select sj.name as job_name 
from msdb.dbo.sysjobhistory sjh 
    inner join msdb.dbo.sysjobs_view sj on sj.job_id = sjh.job_id 
where sjh.step_id = 0 --Job outcome 
    and sjh.run_status = 4 --In progress 

Спасибо, Andomar, для допроса этого. Оказывается, sysjobhistory обновляется только после завершения первого шага. Только идиот мог бы предположить, что если одно значение run_status «In progress», таблица должна быть обновлена ​​при запуске шага! Я искал вокруг, и это, кажется, сложная проблема. Где-то SQL знает, что происходит, но он не раскрывает информацию очень хорошо.

Кажется, вам нужно выбирать между мили сложного кода или использованием недокументированной хранимой процедуры. Вы можете легко найти мили ответов на код - их несколько - по Googling для sysjobhistory. Лично я предпочитаю подход xp:

create table #xp_results(
    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) 

insert #xp_results exec master.dbo.xp_sqlagent_enum_jobs @is_sysadmin = 1, @job_owner = '' 

select sj.name 
from #xp_results xpr 
    inner join msdb.dbo.sysjobs_view sj on sj.job_id = xpr.job_id 
where running = 1 

drop table #xp_results 

Я тестировал это, и он действительно работает. Возможно, это рискованно использовать этот xp, но это то, что использует монитор активности работы - я запускал его с включенным профилировщиком, поэтому, если он изменится, он, вероятно, предоставит другой способ поиска этой информации. Пока вы завершаете этот код в функции или proc и документе, на которые у вас есть зависимость, это кажется наименьшим из многих зол для меня.

+0

На моем SQL Server это перечисляет задания, которые закончились за считанные часы – Andomar