我需要帮助查询MSDB数据库以查找SQL Server代理作业结果。我的查询如下:
SELECT CONVERT(VARCHAR(30), Serverproperty('ServerName')),
a.run_status,
b.run_requested_date,
c.name,
CASE c.enabled
WHEN 1 THEN 'Enabled'
ELSE 'Disabled'
END,
CONVERT(VARCHAR(10), CONVERT(DATETIME, Rtrim(19000101))+(a.run_duration *
9 +
a.run_duration % 10000 * 6 + a.run_duration % 100 * 10) / 216e4, 108),
b.next_scheduled_run_date
FROM (msdb.dbo.sysjobhistory a
LEFT JOIN msdb.dbo.sysjobactivity b
ON b.job_history_id = a.instance_id)
JOIN msdb.dbo.sysjobs c
ON b.job_id = c.job_id
ORDER BY c.name
到目前为止一切顺利,但运行它会返回相同作业的多个结果,具体取决于它们在查询之前运行了多少次。这不好。我希望每份工作只有一个结果,而且只需要最新的结果。
如果我添加字符串: WHERE b.session_id =(来自msdb.dbo.sysjobactivity的SELECT MAX(session_id)) 它工作得更好,但它只根据session_id参数列出最新的作业。这将排除那些没有运行一段时间但也不好的工作。
有人可以帮我吗? 我尝试过使用DISTINCT和/或GROUP BY但无法使其正常工作。
答案 0 :(得分:1)
with cte
AS (SELECT
Convert(varchar(30), SERVERPROPERTY('ServerName')) AS ServerName,
a.run_status,
b.run_requested_date,
c.name,
CASE c.enabled
WHEN 1 THEN 'Enabled'
Else 'Disabled'
END
AS Enabled,
CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101))+(a.run_duration
* 9 +
a.run_duration % 10000 * 6 + a.run_duration % 100 * 10) / 216e4, 108)
AS run_duration,
b.next_scheduled_run_date,
ROW_NUMBER() over (partition by b.job_id ORDER BY b.run_requested_date
DESC) AS RN
FROM (msdb.dbo.sysjobhistory a
LEFT JOIN msdb.dbo.sysjobactivity b
ON b.job_history_id = a.instance_id)
join msdb.dbo.sysjobs c
on b.job_id = c.job_id)
SELECT *
FROM cte
WHERE RN = 1
ORDER BY name