Sql-Server-2000

獲取每個 SQL 作業最近完成的步驟

  • March 1, 2012

我正在嘗試從 MSDB 數據庫中獲取作業列表及其最近完成的步驟。對於單個工作,這非常簡單,例如:

SELECT TOP 1 j.job_id, j.name, h.step_name, h.run_date, h.run_time, h.step_id
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.name = 'my favorite job'
ORDER BY h.run_date DESC, h.run_time DESC, h.step_id DESC

但是我怎樣才能得到所有工作的列表和他們最近完成的步驟呢?

注意這是 SQL 2000,所以我不能使用 PARTITION OVER。我也不能執行 SELECT MAX(),因為它不是單個 RunDateTime 欄位,我必須按兩個欄位(OrderDay、OrderTime)降序排序。

編輯:可能不可能,但我希望能夠做到:

SELECT j.job_id, ...
FROM msdb.dbo.sysjobs j
INNER JOIN (SELECT TOP 1 step_name, run_date, run_time, step_id
           FROM msdb.dbo.sysjobhistory
           WHERE job_id = j.job_id
           ORDER BY run_date desc, run_time desc, step_id desc) as H

什麼的,但它似乎不喜歡那樣的語法……

不幸的是,因為可能存在關聯(倒數第二個步驟可能需要 0 秒,因此在與最後一步“完全相同”的時間完成),這在 SQL Server 2000 中確實不是很漂亮。而不是計算所有datetime 的東西多次我認為最簡單的方法是將其填充到#temp 表中。您可以考慮使用日期時間轉換創建一個永久視圖。

SELECT job_id, step_name, run_date, run_time, step_id, 
   run_datetime = CONVERT(DATETIME, RTRIM(run_date) + ' ' + 
   STUFF(STUFF(RIGHT('00000' + RTRIM(run_time), 6),3,0,':'),6,0,':'))
 INTO #t
     FROM msdb.dbo.sysjobhistory;

SELECT j.job_id, j.name, t.step_name, t.run_date, t.run_time,
      t.step_id, t.run_datetime
FROM #t AS t
INNER JOIN 
   (
     SELECT job_id, run_datetime = MAX(run_datetime)
     FROM #t GROUP BY job_id
   ) AS m 
   ON m.job_id = t.job_id
   AND m.run_datetime = t.run_datetime
INNER JOIN 
   (
     SELECT job_id, run_datetime, step_id = MAX(step_id) 
     FROM #t GROUP BY job_id, run_datetime 
   ) AS s 
   ON s.job_id = m.job_id
   AND s.run_datetime = m.run_datetime
   AND s.step_id = t.step_id
INNER JOIN 
   msdb.dbo.sysjobs AS j
   ON t.job_id = j.job_id
   AND m.job_id = j.job_id
   AND s.job_id = j.job_id;

DROP TABLE #t;

引用自:https://dba.stackexchange.com/questions/13148