2012-09-03 12 views
21

Konieczność posiadania procedury składowanej, która wywołuje zadanie agenta serwera SQL i zwraca informację, czy zadanie zakończyło się pomyślnie, czy też nie.Wykonywanie zadania agenta serwera SQL z procedury składowanej i zwracanie wyniku zadania

tej pory mam

CREATE PROCEDURE MonthlyData 
AS 
EXEC msdb.dbo.sp_start_job N'MonthlyData' 

WAITFOR DELAY '000:04:00' 

EXEC msdb.dbo.sp_help_jobhistory @job_name = 'MonthlyData' 
GO 

który rozpoczyna pracę, co jest najlepszym sposobem, aby dostać się z powrotem, jeśli zadanie przebiegały pomyślnie, czy nie?

Ok dokonał edycji i wykorzystał OPÓŹNIENIE OCZEKIWANIA, ponieważ praca zwykle trwa od 3-4 minut do 4 lat. Czy praca jest bardziej wydajna?

Odpowiedz

19

można uruchomić zapytanie:

EXEC msdb.dbo.sp_help_jobhistory 
    @job_name = N'MonthlyData' 

To będzie powrót do run_status kolumny. Statusy to:

0 - Failed 
1 - Succeeded 
2 - Retry 
3 - Canceled   

Więcej informacji na MSDN

EDIT: Może chcesz sondować swoją pracę i upewnić się, że wykonane. Możesz uzyskać te informacje z procedury sp_help_job. Kiedy ta procedura zwraca status 4, oznacza to, że zadanie jest bezczynne. Następnie można bezpiecznie sprawdzić stan jego działania.

można sondować za pomocą następującego kodu:

DECLARE @job_status INT 
SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''') 

WHILE @job_status <> 4 
BEGIN 
    WAITFOR DELAY '00:00:03' 
    SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''') 
END 

EXEC msdb.dbo.sp_help_jobhistory 
    @job_name = N'NightlyBackups' ; 
GO 

Kod ten będzie sprawdzał stan, odczekać 3 sekundy i spróbuj ponownie. Po uzyskaniu statusu 4 wiemy, że zadanie zostało wykonane i można bezpiecznie sprawdzić historię pracy.

+1

Możesz chcieć wskazać, że musisz przeprowadzić ankietę, dopóki dana praca nie osiągnie "stanu ostatecznego". –

+0

Więc kiedy zaczynam pracę, muszę sondować, aż praca się zakończy, a następnie wykonać jobhistory? – DtotheG

+0

@ChristianK Czy możesz nam powiedzieć coś więcej o sondowaniu dla Job Agenta? – testing

19

Dla wszystkich was, którzy są nie pozwoliły w użyciu OPENROWSET komendy , że to może pomóc. Znalazłem początek dla mojego rozwiązanie tutaj:

http://social.msdn.microsoft.com/Forums/en-US/89659729-fea8-4df0-8057-79e0a437b658/dynamically-checking-job-status-with-tsql

ta opiera się na fakcie, że niektóre kolumny tabeli msdb.dbo.sysjobactivity najpierw uzyskać zaludnionych po zakończeniu pracy w taki czy inny.

-- Start job 
DECLARE @job_name NVARCHAR(MAX) = 'JobName' 
EXEC msdb.dbo.sp_start_job @job_name = @job_name 


-- Wait for job to finish 
DECLARE @job_history_id AS INT = NULL 

WHILE @time_constraint = @ok 
BEGIN 
    SELECT TOP 1 @job_history_id = activity.job_history_id 
    FROM msdb.dbo.sysjobs jobs 
    INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id 
    WHERE jobs.name = @job_name 
    ORDER BY activity.start_execution_date DESC 

    IF @job_history_id IS NULL 
    BEGIN 
     WAITFOR DELAY '00:00:10' 
     CONTINUE 
    END 
    ELSE 
     BREAK 
END 


-- Check exit code 
SELECT history.run_status 
FROM msdb.dbo.sysjobhistory history 
WHERE history.instance_id = @job_history_id 

Możesz chcieć sprawdzić, jak długo pętla WHILE może działać. Zdecydowałem się zachować tę część z przykładu.

wytyczne Microsoft dla kodów wyjścia itp .: http://technet.microsoft.com/en-us/library/ms174997.aspx

0

mogę być nieco późno, ale stwierdziliśmy, że następujące zapytanie pracował dla mnie. Da to czas wykonania i czas zakończenia realizacji. Możesz go zmienić, aby uzyskać również status.

SELECT 
    job.name, 
    job.job_id, 
    job.originating_server, 
    activity.run_requested_date, 
    activity.stop_execution_date, 
    DATEDIFF(SECOND, activity.run_requested_date, activity.stop_execution_date) as Elapsed 
FROM msdb.dbo.sysjobs_view job 
JOIN msdb.dbo.sysjobactivity activity ON job.job_id = activity.job_id 
JOIN msdb.dbo.syssessions sess ON sess.session_id = activity.session_id 
JOIN 
( 
    SELECT 
    MAX(agent_start_date) AS max_agent_start_date 
    FROM 
    msdb.dbo.syssessions 
) sess_max 
ON sess.agent_start_date = sess_max.max_agent_start_date 
WHERE run_requested_date IS NOT NULL 
--AND stop_execution_date IS NULL 
AND job.name = @JobName 
Powiązane problemy