2012-09-03 7 views
21

È necessario disporre di una stored procedure che richiami un processo SQL Server Agent e restituisce se il lavoro è stato eseguito correttamente o meno.Esecuzione del processo SQL Server Agent da una stored procedure e restituzione del risultato del lavoro

Finora ho

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 

che inizia il lavoro, che cosa è il modo migliore per ottenere indietro se il lavoro è stato eseguito correttamente o no?

Ok fatto una modifica e utilizzato WAITFOR DELAY come il lavoro normalmente dura tra 3-4 minuti mai più di 4. Il lavoro, ma c'è un modo più efficiente per farlo?

risposta

19

È possibile eseguire la query:

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

Si tornerà un run_status colonna. Gli stati sono:

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

Maggiori informazioni MSDN

EDIT: Si potrebbe voler per interrogare il vostro lavoro e assicurarsi che sia eseguito. È possibile ottenere queste informazioni dalla procedura sp_help_job. Quando questa procedura restituisce lo stato di 4, significa che il lavoro è inattivo. Quindi è sicuro verificare lo stato di esecuzione.

È possibile eseguire il polling con codice seguente:

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 

Questo codice verifica per lo stato, attendere per 3 secondi e riprovare. Una volta ottenuto lo stato di 4, sappiamo che il lavoro è fatto ed è sicuro controllare la cronologia del lavoro.

+1

È possibile indicare che è necessario eseguire il polling, finché il lavoro in questione non ha raggiunto gli "stati finali". –

+0

Quindi, una volta iniziato il lavoro, devo quindi eseguire il polling fino al termine del lavoro, quindi eseguire la cronologia di lavoro? – DtotheG

+0

@ChristianK Puoi dirci qualcosa in più sul polling per Job Agent? – testing

19

Per tutti voi ragazzi che sono non ammessi utilizzare l'OPENROWSET comando , questo potrebbe aiutare. Ho trovato l'inizio per la mia soluzione qui:

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

Questo si basa sul fatto che alcune colonne della tabella msdb.dbo.sysjobactivity prima vengono popolati termine del processo in un modo o l'altro.

-- 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 

Si potrebbe desiderare di mettere in alcuni controlli per quanto tempo il ciclo WHILE è permesso di correre. Ho scelto di mantenere questa parte fuori dall'esempio.

Microsoft una guida per i codici di uscita ecc .: http://technet.microsoft.com/en-us/library/ms174997.aspx

0

potrei essere un po 'tardi, ma ho trovato che la seguente query ha lavorato per me. Fornirà il tempo di esecuzione e l'ora di fine dell'esecuzione. Puoi modificarlo per ottenere lo 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