3 Stimmen

Jobverlauf in SQL Server

Ich versuche seit mehreren Tagen einige Probleme bezüglich der Verlaufsdaten von SQL Server-Jobs zu lösen, bisher jedoch ohne Erfolg. Ich möchte die Verlaufsdaten der Jobs so anzeigen, wie sie im Log File Viewer zu sehen sind. Ich führe Abfragen aus und erhalte Daten, bin jedoch verwirrt darüber, wie ich feststellen kann, welcher Schritt zu welchem Zeitpunkt für die Ausführung eines bestimmten Jobs gehört. Angenommen, ein Job läuft jede Stunde und hat 4 Schritte. Jedes Mal, wenn der Job ausgeführt wird, werden 5 Datensätze in sysjobhistory für einen erfolgreichen Lauf eingefügt. Nun mache ich mir Gedanken darüber, welche Schritte zu welchem Job zu einem bestimmten Zeitpunkt gehören. Wie kann ich das in einem Drill-Down-Bericht anzeigen, wenn ich einen erstellen möchte.

SELECT sysjobhistory.server,
         sysjobs.name
         AS
         job_name,
         CASE sysjobhistory.run_status
           WHEN 0 THEN 'Fehlgeschlagen'
           WHEN 1 THEN 'Erfolgreich'
           ELSE '???'
         END
         AS
         run_status,
         Isnull(Substring(CONVERT(VARCHAR(8), run_date), 1, 4) + '-' +
                       Substring(CONVERT(VARCHAR(8), run_date), 5, 2) + '-' +
                Substring(CONVERT(VARCHAR(8), run_date), 7, 2), '')
         AS
         [Ausführungsdatum],
         Isnull(Substring(CONVERT(VARCHAR(7), run_time+1000000), 2, 2) + ':'
                 +
                       Substring(CONVERT(VARCHAR(7), run_time+1000000), 4, 2
                        )
                +
                ':' +
                Substring(CONVERT(VARCHAR(7), run_time+1000000), 6, 2), '')
         AS
         [Ausführungszeit],
         Isnull(Substring(CONVERT(VARCHAR(7), run_duration+1000000), 2, 2) +
                 ':' +
                       Substring(CONVERT(VARCHAR(7), run_duration+1000000),
                       4,
                       2)
                + ':' +
                Substring(CONVERT(VARCHAR(7), run_duration+1000000), 6, 2),
         ''
         ) AS
         [Dauer],
         sysjobhistory.step_id,
         sysjobhistory.step_name,
         sysjobhistory.MESSAGE
  FROM   msdb.dbo.sysjobhistory
         INNER JOIN msdb.dbo.sysjobs
           ON msdb.dbo.sysjobhistory.job_id = msdb.dbo.sysjobs.job_id

  ORDER  BY instance_id DESC

1voto

jim31415 Punkte 8230

Sie könnten diese Abfrage ausprobieren. Es erstellt eine temporäre Tabelle von Jobs basierend auf der step_id = 0 und weist jedem Datensatz eine eindeutige Kennung zu. Dann wird die Tabelle mit der Job-Historie anhand der Laufzeit und Dauer verknüpft. Alle Schritte eines Jobs haben also den gleichen RUN_INSTANCE-Wert.

-- Erstellen einer temporären Tabelle von Instanzen, wenn ein Job gestartet wurde
declare @JOBS table
(
    RUN_INSTANCE uniqueidentifier, 
    job_id uniqueidentifier,
    name sysname,
    run_status int, 
    run_date int, 
    run_time int, 
    run_duration int
);

-- Einfügen eines Datensatzes für jeden instanziierten Job und Zuweisen einer eindeutigen Kennung
insert into @JOBS
    select 
        RUN_INSTANCE = NEWID(), 
        h.job_id, 
        j.name, 
        h.run_status, 
        h.run_date, 
        h.run_time, 
        h.run_duration
    from msdb.dbo.sysjobhistory h
        join msdb.dbo.sysjobs j on j.job_id = h.job_id
    where step_id = 0

-- Abfragen der Job-Historie
select 
    h.server,
    j.RUN_INSTANCE, 
    j.name, 
    h.step_id, 
    h.run_date, 
    h.run_time, 
    run_status = 
        case h.run_status
            when 0 then 'fehlgeschlagen'
            when 1 then 'erfolgreich'
            when 2 then 'Wiederholung'
            when 3 then 'abgebrochen'
            when 4 then 'in Bearbeitung'
            else '???'
        end,
    h.message
from @JOBS j
    join msdb.dbo.sysjobhistory h on 
        h.job_id = j.job_id
        and convert(varchar(20),h.run_date) + convert(varchar(20),h.run_time) 
           between convert(varchar(20),j.run_date) + convert(varchar(20),j.run_time) 
           and convert(varchar(20),j.run_date) + convert(varchar(20),j.run_time + j.run_duration) 
order by j.RUN_INSTANCE, h.step_id

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X