如何查询过去30天从未成功运行的SSRS订阅并编写对应SQL?
问题排查
你当前的SQL存在分组逻辑错误:将Status和TimeEnd加入GROUP BY后,语句只会筛选出近30天内「存在失败运行记录」的订阅,无法排除掉同一时间段内有过成功运行的订阅,不符合「从未成功运行」的筛选要求。
可行实现方案
方案1:直接查询近30天无成功记录的报告路径
核心逻辑是先过滤近30天的所有运行记录,按报告路径分组后统计成功运行次数,筛选出成功次数为0的路径:
SELECT ItemPath FROM [ReportServer].dbo.ExecutionLog3 EX WHERE TimeEnd >= DATEADD(day, -30, GETDATE()) GROUP BY ItemPath HAVING SUM(CASE WHEN Status = 'rsSuccess' THEN 1 ELSE 0 END) = 0
方案2:关联订阅表获取完整信息(方便后续禁用操作)
如果需要获取订阅ID、所有者等完整信息,直接用于后续禁用操作,可以关联SSRS的订阅表、目录表查询:
SELECT s.SubscriptionID, c.Path AS ItemPath, c.Name AS ReportName, u.UserName AS SubscriptionOwner, s.LastRunTime, s.LastStatus FROM [ReportServer].dbo.Subscriptions s INNER JOIN [ReportServer].dbo.Catalog c ON s.Report_OID = c.ItemID INNER JOIN [ReportServer].dbo.Users u ON s.OwnerID = u.UserID WHERE s.SubscriptionID IN ( SELECT ex.SubscriptionID FROM [ReportServer].dbo.ExecutionLog3 ex WHERE ex.TimeEnd >= DATEADD(day, -30, GETDATE()) GROUP BY ex.SubscriptionID HAVING SUM(CASE WHEN ex.Status = 'rsSuccess' THEN 1 ELSE 0 END) = 0 )
拿到查询结果中的SubscriptionID后,你可以直接更新Subscriptions表对应记录的状态即可完成禁用操作。
内容的提问来源于stack exchange,提问作者Agenor
相关产品推荐
相关产品推荐

