统计SSRS报表执行次数(排除自动刷新计数)
区分SSRS手动执行与自动刷新执行的方法
当然可以区分啦!我之前处理过类似的需求,通过查询ReportServer数据库里的执行日志相关视图和表,就能轻松把手动执行和自动刷新的报表执行记录分开,甚至直接过滤掉自动刷新的记录。具体方法如下:
核心判断依据:特殊参数
__RefreshReport
SSRS的自动刷新功能触发执行时,会自动传入一个名为__RefreshReport的隐藏参数,参数值为True;而用户手动触发的报表执行不会携带这个参数。这是最可靠的区分方式。你可以通过关联执行日志表和参数表来筛选,这里给你一个实用的SQL查询示例:
SELECT el.ReportPath, el.TimeStart, el.UserName, -- 标记执行类型 CASE WHEN EXISTS ( SELECT 1 FROM ExecutionLogStorage els JOIN ReportParameterValues rpv ON els.ExecutionID = rpv.ExecutionID WHERE els.ExecutionID = el.ExecutionID AND rpv.ParameterName = '__RefreshReport' AND rpv.ParameterValue = 'True' ) THEN '自动刷新' ELSE '手动执行' END AS ExecutionType FROM ExecutionLog3 el ORDER BY el.TimeStart DESC;辅助判断:SessionID复用情况
自动刷新的执行通常会复用同一个SessionID(因为是在同一会话内的定时刷新),而手动执行一般会生成新的SessionID或者对应用户主动发起的独立会话。不过这个方法不如参数判断可靠,建议和参数检查结合使用,提升准确性。
如果你只需要忽略自动刷新的执行记录,直接在查询中过滤掉携带__RefreshReport=True的记录即可,示例SQL如下:
SELECT * FROM ExecutionLog3 el WHERE NOT EXISTS ( SELECT 1 FROM ExecutionLogStorage els JOIN ReportParameterValues rpv ON els.ExecutionID = rpv.ExecutionID WHERE els.ExecutionID = el.ExecutionID AND rpv.ParameterName = '__RefreshReport' AND rpv.ParameterValue = 'True' );
注意:不同版本的SSRS可能在系统表/视图的命名上略有差异,但__RefreshReport这个隐藏参数的逻辑在多数版本中都是一致的,放心使用即可。
内容的提问来源于stack exchange,提问作者Jamie Stuart Robin Parsons
相关产品推荐
相关产品推荐

