2010-01-21 11 views
8

Ich habe einen Einzelschrittauftrag, der eine gespeicherte Prozedur ausführt. Ich möchte das Datum der letzten erfolgreichen Jobausführungszeit erhalten, so dass ich nur ein Delta anstelle des gesamten Datensatzes aktualisieren kann.Datum des letzten erfolgreichen Joblaufs abrufen?

Im Moment habe ich den Job eingerichtet, um einmal jeden Tag zu laufen, so dass ich einen Standardparameter habe, wenn es null ist, setze ich es auf GETDATE() - 1, also aktualisiere ich noch ein Delta, aber was ich möchte Zu tun ist das Datum bis zur letzten erfolgreichen Ausführung des Jobs.

exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime 

Derzeitiges Verfahren etwas ist wie

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 

Antwort

0

Informationen Mit den folgenden Themen:

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

Das ist, was ich kam mit ...

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 

ich bin mit dieser nicht besonders komfortabel, aber ich bevorzugen Sie diese Methode zum Abrufen der Job-ID abhängig vom Jobnamen.

2

Werfen Sie einen Blick auf this Artikel, kann es Sie in die richtige Richtung weisen. Leider habe ich keinen SQL Server auf meinem Heimcomputer und kann es nicht für dich testen!

Sie müssen im Grunde die syjobactivity-Tabelle abfragen und die Werte von start_execution_date und stop_execution_date abrufen. Sie benötigen die Job-ID, aber ich bin mir nicht sicher, woher Sie das bekommen.

Ich hoffe, das hilft.

EDIT Ok, habe ich etwas mehr Forschung getan und fanden die folgende Code-Snippet

DECLARE @jobId binary(16) 

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

Die Tabellen Sie sind sysjobs und sysjobhistory in msdb. Seien Sie gewarnt! SQL Server verwaltet nur eine bestimmte Anzahl von Datensätzen. Wenn also zu viele Aufträge vorhanden sind und der Verlauf nicht groß genug ist, haben Sie keine Historie.

Der folgende Code ruft den job_id für den angegebenen Jobnamen ab und fragt die Verlaufstabelle nach dem letzten erfolgreich abgeschlossenen Lauf ab (d. H. Schritt 0, Status 1). Wie Sie sehen können, müssen Sie die Laufzeit zu einem Zeitpunkt zurück zu konvertieren, wie SQL Server speichert sie in zwei int Spalten:

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

Danke für die Info auf sysjobhistory, ich habe Angst, obwohl auf den Jobnamen abhängig zu sein. – Dave

+0

dachte, das könnte für Sie einfacher gewesen sein. Es ist noch einfacher ohne den Jobnamen! –

+0

Ja, aber ich brauche immer noch die Job-ID – Dave

2

Da sysjobhistory nur eine bestimmte Anzahl von Datensätzen verwaltet, empfehle ich mit sysjobactivity, die die letzte Ausführung "Verlauf" von jedem Job und Sitzung hält.

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; 

HINWEIS: Wenn ein Job nicht während der Lebensdauer einer Sitzung, die fast alle Werte werden null ausgeführt worden ist.

AUCH gibt es ein System Stored Proceduresp_help_job, die diese Informationen zurückgibt. Es akzeptiert job_id, enabled usw. als Parameter, um 1 oder mehr Datensätze zurückzugeben.

0

Last erfolgreich laufen Arbeitsplätze zu erhalten:

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