如何配置SSRS异常报表仅在存在数据时自动发送邮件
SSRS异常报表仅在有数据时发送邮件的配置方案
针对你的需求(仅当报表存储过程返回10分钟内的异常数据时发送邮件),提供两种可行的配置方法,解决你之前数据驱动订阅(DDS)失败的问题:
方法一:修正数据驱动订阅(DDS)配置
如果之前DDS没成功,大概率是订阅的判断逻辑没设置对,按以下步骤重新配置:
第一步:准备订阅判断数据源
创建一个专门用于判断是否发送邮件的查询,替代直接用报表的数据源:-- 仅当存在符合条件的数据时返回一行,触发订阅 SELECT '收件人邮箱' AS Recipient, '异常通知:临时工位分配提醒' AS Subject WHERE EXISTS ( SELECT * FROM [desks_temporary_allocations_notifications] n WHERE DATEADD(n,10,n.[notification_date]) > GETDATE() )这个查询只有在有异常数据时才返回结果,无数据时返回空。
第二步:配置数据驱动订阅
- 在报表管理器中打开目标报表,创建「数据驱动订阅」
- 订阅的数据源选择上述判断查询的数据源(确保权限足够)
- 订阅设置里:
- 收件人:选择查询返回的
Recipient字段 - 主题:选择查询返回的
Subject字段 - 报表格式:选你需要的(如PDF、Excel)
- 执行计划:设置为每10分钟执行一次,和数据时间范围匹配
- 收件人:选择查询返回的
- 保存订阅后,只有当判断查询返回结果时,才会触发邮件发送。
方法二:SQL Server代理作业+邮件发送(更灵活)
如果DDS还是有问题,用SQL作业直接控制逻辑,步骤更直观:
第一步:创建作业步骤
- 打开SQL Server代理,新建作业,添加一个「Transact-SQL (T-SQL)」步骤,内容如下:
-- 先判断是否存在异常数据 IF EXISTS ( SELECT * FROM [desks_temporary_allocations_notifications] n WHERE DATEADD(n,10,n.[notification_date]) > GETDATE() ) BEGIN -- 存在数据时,调用邮件存储过程发送报表结果 EXEC msdb.dbo.sp_send_dbmail @profile_name = '你的SMTP配置文件名', -- 提前在数据库邮件里配置好 @recipients = '收件人邮箱', @subject = '异常通知:临时工位分配提醒', @query = 'EXEC 你的存储过程名', -- 执行报表对应的存储过程 @query_result_header = 1, -- 显示表头 @query_result_width = 32767, @attach_query_result_as_file = 1, -- 结果作为附件 @query_attachment_filename = '工位分配异常报表.csv', @query_result_separator = ','; END
- 打开SQL Server代理,新建作业,添加一个「Transact-SQL (T-SQL)」步骤,内容如下:
第二步:设置作业执行计划
把作业的执行计划设为每10分钟执行一次,和存储过程的时间范围对齐,确保及时捕获异常数据。
关键注意事项
- 性能优化:给
desks_temporary_allocations_notifications表的notification_date字段建索引,避免每10分钟扫描全表:CREATE INDEX IX_Desks_NotificationDate ON [desks_temporary_allocations_notifications](notification_date); - 权限检查:确保SSRS服务账户(DDS用)或SQL代理账户(作业用)有:
- 执行存储过程的权限
- 发送数据库邮件的权限(作业方法)
- 访问SSRS报表的权限(如果用DDS)
内容的提问来源于stack exchange,提问作者esinmal
相关产品推荐
相关产品推荐

