我正在尝试从 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 表中。您可以考虑使用日期时间转换创建永久视图。
我刚刚注意到 sysjobhistory确实有一个身份密钥“INSTANCE_ID”。我不知道为什么我认为桌子上没有...
为每个作业找到最大的 INSTANCE_ID(不包括步骤 0)使这变得容易得多,并且避免了临时表:
我仍然必须将日期/时间转换放在那里,但这似乎可行。