2014-01-23 57 views
3

如何使用SQL獲取SQL Server代理中的上次運行作業詳細信息,包括僅用於上次運行作業(而非作業結果)的步驟詳細信息,因爲我想在如何獲取SQL中的上次運行作業詳細信息

幫助被困在了好久了

這是我一直在使用下面的代碼請申請,這勾起了所有的工作作業歷史記錄的所有步驟,

不過,我只是想查看最近的步驟運行作業

感謝

USE msdb 
Go 
SELECT j.name JobName,h.step_name StepName, 
CONVERT(CHAR(10), CAST(STR(h.run_date,8, 0) AS dateTIME), 111) RunDate, 
STUFF(STUFF(RIGHT('000000' + CAST (h.run_time AS VARCHAR(6)) ,6),5,0,':'),3,0,':') RunTime, 
h.run_duration StepDuration, 
    case h.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, 
h.message MessageGenerated 
FROM sysjobhistory h 
inner join sysjobs j 
ON j.job_id = h.job_id 

    LEFT JOIN (
       SELECT 
        [job_id] 
        , [run_date] 
        , [run_time] 
        , [run_status] 
        , [run_duration] 
        , [message] 
        , ROW_NUMBER() OVER (
              PARTITION BY [job_id] 
              ORDER BY [run_date] DESC, [run_time] DESC 
        ) AS RowNumber 
       FROM [msdb].[dbo].[sysjobhistory] 
       WHERE [step_id] = 0 
      ) AS [sJOBH] 
      ON j.[job_id] = [sJOBH].[job_id] 
      AND [sJOBH].[RowNumber] = 1 

where j.job_id = 'F04E5D3B-C873-448A-805C-C6309A92DAEC' 

ORDER BY j.name, h.run_date, h.run_time desc 
GO 
+0

您可以將此查詢與另一個執行Max(last_run_date)的查詢合併,並按您的作業名稱進行分組。然後你的加入條款可以加入工作,也是last_run_date – ganders

回答

6

希望這有助於,

其他加盟msdb.dbo.sysjobactivity顯示您在工作層面的開始/結束時間。使用此範圍可以指定僅顯示最近運行的作業步驟。

DECLARE @job_id UNIQUEIDENTIFIER 
      ,@job_name VARCHAR(256) 

    SET @job_id = 'DF4C9555-5B24-4649-97CE-5708C53F762C' 
    SET @job_name = 'syspolicy_purge_history' 

    --search for job_id if none was provided 
    SELECT @job_id = COALESCE(@job_id,job_id) 
    FROM msdb.dbo.sysjobs 
    WHERE name = @job_name 

    SELECT t2.instance_id 
      ,t1.name as JobName 
      ,t2.step_id as StepID 
      ,t2.step_name as StepName 
      ,CONVERT(CHAR(10), CAST(STR(t2.run_date,8, 0) AS DATETIME), 111) as RunDate 
      ,STUFF(STUFF(RIGHT('000000' + CAST (t2.run_time AS VARCHAR(6)) ,6),5,0,':'),3,0,':') as RunTime 
      ,t2.run_duration 
      ,CASE t2.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 
      ,t2.message as MessageGenerated  
    FROM msdb.dbo.sysjobs t1 
    JOIN msdb.dbo.sysjobhistory t2 
      ON t1.job_id = t2.job_id 
      --Join to pull most recent job activity per job, not job step 
    JOIN (
      SELECT TOP 1 
        t1.job_id 
        ,t1.start_execution_date 
        ,t1.stop_execution_date 
      FROM msdb.dbo.sysjobactivity t1 
      --If no job_id detected, return last run job 
      WHERE t1.job_id = COALESCE(@job_id,t1.job_id) 
      ORDER 
      BY  last_executed_step_date DESC 
      ) t3 
      --Filter on the most recent job_id 
      ON t1.job_id = t3.job_Id 
      --Filter out job steps that do not fall between start_execution_date and stop_execution_date 
      AND CONVERT(DATETIME, CONVERT(CHAR(8), t2.run_date, 112) + ' ' 
      + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), t2.run_time), 6), 5, 0, ':'), 3, 0, ':'), 121) 
      BETWEEN t3.start_execution_date AND t3.stop_execution_date 

編輯:在頂部添加了兩個參數@job_id和@job_name。如果未提供@job_id,則首先嚐試確定提供的@job_name的job_id,並返回上一個運行作業,但未提供值。

+0

嗨,謝謝你的完美!非常感謝你,我想補充的一個修改是隻顯示上一份工作與一個特定的job_id運行,如果你可以補充說,那將是驚人的! – neeko

相關問題