sql >> Base de Datos >  >> RDS >> Sqlserver

Ejecutar trabajo del Agente SQL Server desde un procedimiento almacenado y devolver el resultado del trabajo

Para todos los que no están permitidos para usar el OPENROWSET comando, esto podría ayudar. Encontré el comienzo de mi solución aquí:

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

Esto se basa en el hecho de que algunas columnas de msdb.dbo.sysjobactivity la tabla primero se llena después de que el trabajo finaliza de una forma u otra.

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

Es posible que desee realizar algunas comprobaciones sobre cuánto tiempo se permite que se ejecute el bucle WHILE. Elegí mantener esa parte fuera del ejemplo.

Guía de Microsoft para códigos de salida, etc.:http://technet.microsoft.com /en-us/library/ms174997.aspx