如何配置SSRS数据驱动订阅在每月第3个工作日触发
实现SSRS每月第3个工作日触发数据驱动订阅
优化后的SQL:获取每月第3个工作日
从你的日历表中精准提取每年每个月的第3个工作日,用窗口函数ROW_NUMBER()给每月的工作日排序,逻辑更简洁清晰:
WITH MonthlyWorkdays AS ( SELECT date, year, MONTH(date) AS month, -- 按年、月分组,给当月工作日按日期排序编号 ROW_NUMBER() OVER (PARTITION BY year, MONTH(date) ORDER BY date) AS WorkdayRank FROM Company.dbo.Company_Calendar WHERE day_of_week NOT IN (1,7) -- 排除周末(假设1=周日、7=周六,可根据你的实际定义调整) AND date <> '1900-01-01' -- 过滤无效日期 ) SELECT year, month, date AS ThirdWorkdayOfMonth FROM MonthlyWorkdays WHERE WorkdayRank = 3 -- 如需限定当前年,可添加 AND year = YEAR(GETDATE())
触发订阅的判断逻辑
要让SSRS仅在当天是当月第3个工作日时执行订阅,你可以编写如下SQL作为数据驱动订阅的数据源:
DECLARE @Today DATE = GETDATE(); -- 检查当天是否是当月第3个工作日 IF EXISTS ( SELECT 1 FROM ( SELECT date, ROW_NUMBER() OVER (PARTITION BY year, MONTH(date) ORDER BY date) AS WorkdayRank FROM Company.dbo.Company_Calendar WHERE day_of_week NOT IN (1,7) AND date <> '1900-01-01' AND year = YEAR(@Today) AND MONTH(date) = MONTH(@Today) ) AS MonthlyWorkdays WHERE WorkdayRank = 3 AND date = @Today ) BEGIN -- 此处返回订阅所需的收件人信息(替换为你的实际收件人表查询) SELECT Email AS [To], FullName AS [DisplayName] FROM YourRecipientTable; -- 替换为你的收件人表名称 END ELSE BEGIN -- 返回空结果集,SSRS会因无数据跳过本次订阅发送 SELECT 1 WHERE 1 = 0; END
原有SQL的问题说明
- 存在重复的
year = 2023条件,属于冗余写法; - 注释中的CASE语句语法错误,判断多个值应使用
IN而非=加括号; day_weekday_ct = 1的条件不符合需求(这是筛选每周第1个工作日),需要移除才能正确统计每月的工作日序号。
内容的提问来源于stack exchange,提问作者ziggy2561
相关产品推荐
相关产品推荐

