2010-01-21 19 views
8

Tengo un solo paso que ejecuta un procedimiento almacenado. Me gustaría obtener la fecha del último tiempo de ejecución del trabajo exitoso para poder actualizar un delta en lugar de todo el conjunto de datos.¿Obtener la fecha de la última ejecución de trabajo exitosa?

Ahora tengo la configuración de trabajo para ejecutar una vez al día, así que tengo un parámetro predeterminado que si es nulo lo configuré en GETDATE() - 1, así que todavía estoy actualizando un delta, pero lo que me gustaría hacer es establecer la fecha hasta la última ejecución exitosa del trabajo.

exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime 

procedimiento actual es algo así como

CREATE PROCEDURE dbo.usp_UpdateFrom 
    @FromDate datetime = NULL --would like to pass last successful execution time of the job 
AS 
    IF @FromDate IS NULL 
     SET @FromDate = GETDATE() - 1 

    -- do stuff 
END 

Respuesta

0

Utilizando la información de los siguientes temas:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=112427 http://www.sqlservercentral.com/Forums/Topic542581-145-1.aspx

esto es lo que me ocurrió ...

DECLARE 
    @statement nvarchar(72), 
    @job_id uniqueidentifier, 
    @last_run_date datetime 

SET @statement = 'SET @guid = CAST(' + SUBSTRING(APP_NAME(), 30, 34) + ' as uniqueidentifier)' 

EXECUTE sp_executesql @statement, N'@guid uniqueidentifier OUT', @guid = @job_id OUT 

SELECT TOP (1) 
    @last_run_date = CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime) 
FROM msdb.dbo.sysjobhistory 
WHERE job_id = @job_id 
AND run_status = 1 
ORDER BY 
    CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime) DESC 

EXEC dbo.usp_UpdateFrom @last_run_date 

no estoy particularmente cómodo con esto, pero yo prefiera este método para obtener el job_id en función del nombre del trabajo.

2

Tenga una mirada en this artículo, se puede apuntar en la dirección correcta. Lamentablemente, no tengo SQL Server en mi máquina doméstica, así que no puedo probarlo por ti.

Básicamente necesita consultar la tabla sysjobactivity y obtener los valores de start_execution_date y stop_execution_date. Necesitarás el job_id, pero no estoy seguro de dónde obtendrás eso.

Espero que esto ayude.

EDITAR Ok, he hecho algunas investigaciones más y encontró el siguiente fragmento de código

DECLARE @jobId binary(16) 

SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'Name of Your Job') 
14

las tablas que desea son sysjobs y sysjobhistory en msdb. ¡Aunque ten cuidado! SQL Server solo mantiene una cierta cantidad de registros, por lo que si hay demasiados trabajos y el historial no es lo suficientemente grande, terminará sin historial.

El siguiente código recupera el job_id para el nombre de trabajo dado, y consulta la tabla de historial para la última ejecución finalizada exitosamente (es decir, paso 0, estado 1). Como se puede ver, hay que convertir el tiempo de ejecución de nuevo a una fecha, como SQL Server almacena en dos columnas int:

DECLARE @job_id binary(16) 
SELECT @job_id = job_id FROM msdb.dbo.sysjobs WHERE (name = N'YourJobName') 

SELECT TOP 1 
    CONVERT(DATETIME, RTRIM(run_date)) 
    + ((run_time/10000 * 3600) 
    + ((run_time % 10000)/100 * 60) 
    + (run_time % 10000) % 100)/(86399.9964) AS run_datetime 
    , * 
FROM 
    msdb..sysjobhistory sjh 
WHERE 
    sjh.step_id = 0 
    AND sjh.run_status = 1 
    AND sjh.job_id = @job_id 
ORDER BY 
    run_datetime DESC 
+0

Gracias por la información sobre sysjobhistory, tengo miedo de ser dependiente del nombre del trabajo sin embargo. – Dave

+0

pensó que esto podría haber sido más fácil para usted. ¡Es aún más simple sin el nombre del trabajo! –

+0

sí, pero aún necesito obtener el job_id – Dave

2

Dado que sysjobhistory solo mantiene un cierto número de registros, lo recomiendo usando sysjobactivity, que mantiene el último "historial" de ejecución de cada trabajo y sesión.

SELECT TOP 1 start_execution_date 
FROM msdb.dbo.sysjobactivity 
WHERE run_requested_date IS NOT NULL 
AND job_id = @job_id 
ORDER BY session_id DESC; 

NOTA: Si un trabajo no se ha ejecutado durante la vida de una sesión, casi todos los valores serán null.

TAMBIÉN hay un sistema de procedimientos almacenados sp_help_job que devuelve esta información. Acepta job_id, enabled, etc. como parámetros para devolver 1 o más registros.

0

Para acceder al último empleo ejecuten correctamente:

SELECT 
    h.[job_id] 
    ,j.Name JobName 
    ,CONVERT(CHAR(10), CAST(STR(run_date,8, 0) AS dateTIME), 111) [LastRunDate] 
    ,STUFF(STUFF(RIGHT('000000' + 
    CAST (run_time AS`` VARCHAR(6)) ,6),5,0,':'),3,0,':') [LastRunTime] 
    ,CASE run_status 
    WHEN 0 THEN 'Failed' 
    WHEN 1 THEN 'Succeeded' 
    WHEN 2 THEN 'Retry' 
    WHEN 3 THEN 'Cancelled' 
    WHEN 4 THEN 'In Progress' 
    END AS ExecutionStatus             
    FROM [msdb].[dbo].[sysjobhistory] h 
    JOIN msdb.dbo.sysjobs j ON h.job_id=j.job_id 
    WHERE run_status=1 
    ORDER BY run_date DESC,run_time DESC 
Cuestiones relacionadas