如何在2017报表服务器上配置每两周执行一次的SSRS订阅
SSRS 双周周一推送订阅最优实现方案
现有方案缺陷
你当前设置的每月第2、4周推送的方案无法稳定满足需求:月份天数不固定,部分自然月存在5个周,还会出现跨月/跨年薪资周期的偏移问题,会出现两次推送间隔不足2周或超过2周的情况,无法匹配固定双周的薪资周期规则。
方案1:数据驱动订阅(推荐,匹配精度最高)
适合拥有SSRS企业版/具有数据驱动订阅配置权限的场景:
- 首先创建一张薪资周期控制表,提前维护未来1~2年所有薪资周期结束日期、对应应推送的周一日期,示例表结构如下:
CREATE TABLE Payroll_Push_Schedule ( ID INT IDENTITY(1,1) PRIMARY KEY, Payroll_Cycle_End DATE NOT NULL, -- 薪资周期结束日期 Push_Date DATE NOT NULL, -- 要求推送的周一日期 Is_Pushed BIT DEFAULT 0 -- 推送标记,避免重复推送 )
- 新建SSRS数据驱动订阅,订阅的数据源绑定上述控制表,数据查询逻辑为:
SELECT * FROM Payroll_Push_Schedule WHERE Push_Date = CAST(GETDATE() AS DATE) AND Is_Pushed = 0
- 订阅的触发计划设置为每周一执行,每次执行时如果当天匹配表中维护的推送日期就会自动触发报表推送,否则不会执行
- 可以配置推送成功后的后置更新逻辑,将对应行的
Is_Pushed字段更新为1,避免异常场景下重复推送
方案2:SQL Agent 作业触发订阅(适配标准版SSRS场景)
如果你使用的SSRS标准版不支持数据驱动订阅,可以用SQL Server代理作业实现:
- 同样先维护上述的薪资周期推送日期表
- 新建SQL Agent作业,执行频率设置为每周一执行
- 作业步骤添加判断逻辑:如果当天日期在推送日期表中,就调用SSRS内置存储过程触发指定报表订阅,示例触发代码:
-- 触发指定SSRS订阅,订阅ID可从ReportServer库的dbo.Subscriptions表查询获取 EXEC ReportServer.dbo.AddEvent @EventType = 'TimedSubscription', @EventData = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
补充优化点
如果你的薪资周期是固定每14天循环一次,无需手动维护周期表,可以直接在判断逻辑中用日期函数计算推送日期,不用手动维护配置表。
内容的提问来源于stack exchange,提问作者Gloria_2015
相关产品推荐
相关产品推荐

