Sql-Server-2000
獲取每個 SQL 作業最近完成的步驟
我正在嘗試從 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;