SSRS订阅查询失败仍发送不完整报表如何配置仅成功时发送
SSRS订阅存储过程执行失败时阻止发送不完整报表解决方案
首先明确:SSRS原生没有专门的配置开关实现该需求,默认行为是只要获取到部分可解析的数据集就会尝试渲染报表并触发订阅发送,可通过以下几种可落地的方案实现需求,无需修改原有存储过程逻辑的方案优先列出:
无需修改原有存储过程的方案
方案1:新增封装存储过程对接SSRS数据集
你不需要调整原有业务存储过程的代码,只需新建一个权限范围内的封装存储过程,通过TRY-CATCH捕获原有存储过程的执行异常,异常发生时直接抛出错误不返回任何结果集,SSRS未获取到合法的完整结果集时会标记报表执行失败,不会触发订阅发送。示例代码如下:CREATE PROC 自定义封装存储过程名 -- 原有存储过程需要的参数原样声明 @Param1 INT, @Param2 VARCHAR(50) AS BEGIN SET NOCOUNT ON; BEGIN TRY -- 声明临时表接收原有存储过程的返回结果 CREATE TABLE #TempResult( -- 字段结构和原有存储过程返回的结果集完全一致 Col1 INT, Col2 VARCHAR(100), ... ) -- 调用原有存储过程,结果插入临时表 INSERT INTO #TempResult EXEC 原有业务存储过程名 @Param1,@Param2 -- 执行到此处说明原有存储过程无异常,返回完整结果 SELECT * FROM #TempResult END TRY BEGIN CATCH -- 异常时直接抛出错误,不返回任何结果 THROW; END CATCH END之后将SSRS报表的数据集调用对象改为上述新的封装存储过程即可。
方案2:数据驱动订阅加前置校验
将原有普通订阅改为数据驱动订阅,新增一张简单的存储过程执行状态表,每次订阅触发前先通过作业调用原有存储过程并写入执行状态(成功/失败),数据驱动订阅的收件人查询逻辑先判断最近一次执行状态为成功时才返回预设的收件人列表,状态为失败时返回空列表,SSRS检测到无收件人时不会发送报表。方案3:自定义SQL代理作业调度
禁用SSRS自动生成的订阅代理作业,自行新建SQL代理作业,作业步骤分为两步:第一步调用原有存储过程,捕获执行结果;第二步仅在第一步执行成功的情况下调用SSRS订阅的执行存储过程ReportServer.dbo.AddEvent触发订阅发送,第一步失败时直接终止作业。
可修改原有存储过程时的最简方案
- 方案4:原有存储过程加事务与错误捕获
在原有存储过程外层套TRY-CATCH逻辑,所有数据处理放在事务内执行,出现异常时回滚事务并直接抛出错误,不返回任何部分结果集,即可触发SSRS订阅失败拦截。
内容的提问来源于stack exchange,提问作者SQL_Kid
相关产品推荐
相关产品推荐

