sp_start_job ждать завершения работы [дубликата]

Возможный дубликат:
выполнение задания агента SQL Server из хранимой процедуры и возвращение результата задания

Есть ли способ определить, когда работа агента SQL завершена после того, как он был запущен с sp_start_job?

13.12.2008 13:34:54
5 ОТВЕТОВ

XP_SQLAGENT_ENUM_JOBSможно использовать, но без документов. Обычно он используется для обнаружения долго выполняющихся заданий.

Конечно, есть также sp_help_jobsили просто мониторинг таблиц истории заданий

3
13.12.2008 14:16:03
Я бы предпочел остаться на документально оформленной земле. Я знаю о sp_help_jobs, однако это довольно уродливо, так как, насколько я понимаю, мне нужно прочитать набор результатов во временную таблицу, а затем выбрать из этого. Я искал что-то немного чище, хотя это сработало бы.
Greg Dean 16.12.2008 16:42:16

Я действительно должен был сделать это недавно, и вот как я думаю о его реализации. Я создаю временное задание через sp_add_job и sp_add_jobstep и устанавливаю @delete_level равным 3 (всегда удаляю после запуска).

Я не на 100% продан на этом подходе, как вы, вероятно, можете сказать из названия хранимой процедуры. Тем не менее, это работает:

CREATE PROCEDURE spWorkaround_checkJobExists

@job_id UNIQUEIDENTIFIER   
, @thisIteration tinyint  
, @maxRecurse tinyint

AS

IF (@thisIteration <= @maxRecurse)
BEGIN
    IF EXISTS(
    select * FROM msdb.dbo.sysjobs where job_id = @job_id
    ) 
    BEGIN
        WAITFOR DELAY '00:00:01'
        DECLARE @nextIteration int
        SET @nextIteration = @thisIteration + 1
        EXEC dbo.spWorkaround_checkJobExists  @job_id, @nextIteration, @maxRecurse
    END
END

Конечно, вы захотите вставить некоторый код, чтобы обеспечить максимальное количество повторений, но вы поняли идею. Вы также можете передать параметр, чтобы контролировать, как часто происходит рекурсия. В моем случае через десять секунд результаты не имеют смысла.

То, что я здесь делаю, может быть изменено для заданий, которые не должны быть отброшены сразу после выполнения, путем изменения критериев выбора для проверки состояния выполнения задания, например, с помощью sp_help_job, передающего @job_name или @job_id и @execution_status = 0

1
6.09.2012 14:11:35
 sp_help_job   @job_name   @execution_status = 0
1
9.05.2012 00:21:55
sp_help_job возвращает несколько результирующих наборов, поэтому немного больше кода, как вы считаете, использовать его в sp_help_job в TSQL для проверки работающего задания, будет более полезным, чем три слова кода, которые даже не будут работать без исправления
Thomas Franz 31.05.2019 15:50:45

В этой статье описывается SP для запуска задания агента SQL и ожидания.

-- output from stored procedure xp_sqlagent_enum_jobs is captured in the following table
    declare @xp_results TABLE ( 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)

    -- start the job
    declare @r as int
    exec @r = msdb..sp_start_job @job

    -- quit if unable to start
    if @r<>0
        RAISERROR (N'Could not start job: %s.', 16, 2, @job)

    -- start with an initial delay to allow the job to appear in the job list (maybe I am missing something ?)
    WAITFOR DELAY '0:0:01';
    set @seccount = 1

    -- check job run state
    insert into @xp_results
    execute master.dbo.xp_sqlagent_enum_jobs 1, @job_owner, @job_id

    set @running= (SELECT top 1 running from @xp_results)

    while @running<>0
    begin
        WAITFOR DELAY '0:0:01';
        set @seccount = @seccount + 1

        delete from @xp_results

        insert into @xp_results
        execute master.dbo.xp_sqlagent_enum_jobs 1, @job_owner, @job_id

        set @running= (SELECT top 1 running from @xp_results)
    end

    -- result: not ok (=1) if still running

    if @running <> 0 begin
        -- still running
        return 0
    end
    else begin

        -- did it finish ok ?
        set @run_status = 0

        select @run_status=run_status
        from msdb.dbo.sysjobhistory
        where job_id=@job_id
          and cast(run_date as bigint) * 1000000 + run_time >= @start_job

        if @run_status=1
            return 1  --finished ok
        else  --error
            RAISERROR (N'job %s did not finish successfully.', 16, 2, @job)

    end

    END TRY
4
27.03.2013 17:40:08
эта статья мне в любом случае помогла ...
topwik 27.03.2013 17:43:15
SELECT TOP 1 1 AS FinishedRunning
FROM msdb..sysjobactivity aj
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
WHERE aj.stop_execution_date IS NOT NULL
AND aj.start_execution_date IS NOT NULL
AND sj.name = 'YourJobNameHere'
AND NOT EXISTS
(
    SELECT TOP 1 1
    FROM msdb..sysjobactivity New
    WHERE New.job_id = aj.job_id
    AND new.start_execution_date > aj.start_execution_date
)
1
25.05.2012 20:08:51