SSRS Report Builder如何获取表/矩阵数据变更的日期时间
SSRS Report Builder获取Table/Matrix数据变更时间的实现方案
SSRS本身没有内置的Table/Matrix控件级别的数据变更追踪能力,不要指望靠控件自带属性直接拿到数据变更时间,所有可行实现都需要从数据源或报表缓存层做配置,完全可以做到「仅数据变更时才更新时间戳,不随报表每次打开返回当前时间」的需求。
- 方案1:业务表侧维护更新时间戳(最推荐,准确性最高)
给你报表依赖的底层业务表新增LastModifiedDateTime字段,在数据写入环节(触发器、ETL作业、业务写入逻辑)同步更新该字段值,保证每次数据增删改都会把这个字段更新为操作发生的时间。后续在SSRS数据集查询中直接读取该字段,绑定到Table/Matrix的对应单元格即可。
这个方案的时间戳完全和实际业务数据变更绑定,和报表的渲染、执行动作完全无关,不会出现每次打开报表时间就刷新的问题。 - 方案2:基于数据集缓存+执行日志取更新时间(适合无法修改业务表结构的场景)
首先给报表绑定的数据集启用缓存:如果是SQL Server数据源可以配置SQL依赖缓存,做到源数据变更时缓存自动失效;其他数据源可以结合实际数据更新频率配置定时缓存过期规则(比如源数据每日凌晨2点完成ETL更新,就配置缓存每日2:10过期)。
不要使用=Now()、=Globals!ExecutionTime这类内置表达式取时间——这类值每次报表执行都会返回当前时间,和数据是否变更无关。你可以新增一个单独的数据集,查询SSRS自带的执行日志,取当前报表最近一次实际拉取源数据(而非读取缓存)的执行时间作为数据更新时间,参考查询代码:
将该查询返回的时间字段绑定到Table/Matrix的对应位置即可,这个逻辑下只有缓存失效、重新从源端拉取新数据时,时间值才会更新。SELECT TOP 1 TimeStart AS DataLastModifiedTime FROM ReportServer.dbo.ExecutionLogStorage WHERE ReportID = @ReportID AND DataRetrievalTime > 0 -- 过滤读取缓存、未实际请求源数据的执行记录 ORDER BY TimeStart DESC
注意:不要尝试在SSRS的自定义代码里写前后会话的数据集比对逻辑,SSRS没有跨用户会话的持久化存储能力,这类实现不仅性能差,也没法在多用户访问场景下正常工作。
内容的提问来源于stack exchange,提问作者Lawrence Lau
相关产品推荐
相关产品推荐

