停止在SSRS 2008 R2数据驱动订阅中发送空报告

时间:2011-12-19 10:31:10

标签: sql-server-2008 reporting-services ssrs-2008

我正在使用SSRS 2008 R2中的数据驱动订阅安排一些报告。

无论生成的报告是否为空,报告仍会发送给收件人。这是一个长期存在的常见问题,老实说,我在论坛上看到的建议并没有完全解决。

我尝试过的其中一个建议是,我创建了一个隐藏参数,并将其设置为默认值选项卡中主数据集上的字段。如果报告为空则抛出错误,如果报表设计器中显示某些数据,则生成报表。但是,当我安排此报告时,它会要求我提供默认值,如果不提供它,我就无法完成调度程序向导。如果我提供任何默认值,则仍会发送空报告。但与此不同的是,应该为空报告抛出错误,不应发送它们。

以前有人用过这种方法吗?如果是的话,你能告诉我我在这里失踪了吗?

我只是想知道你们是否有一个理想的解决方案来解决这个问题。

非常感谢你的帮助。

此致

5 个答案:

答案 0 :(得分:9)

以下是我的解决方法:通过存储过程检索数据并将以下代码放在最后

IF @@ROWCOUNT = 0 RAISERROR('No data', 16, 1)

查看Russell Christopher's article and comments了解详情。让我感到惊讶的是它已经有6年了,而且MS无法找到解决方案:3

答案 1 :(得分:0)

实现这一目标的方法很多。可以根据查询结果轻松更改订阅的行为。只需查询您的数据库以找出情况(例如在进程日志中 - 或者只是从您必须运行的过程返回状态),并使用if语句。

E.g:

DECLARE @SomeVariable INT = 0; -- 0 means good

EXEC @SomeVariable = reports.sp_some_proc; -- Returns 1 if something is bad

IF @NoData = 0 -- everything is fine send report

SELECT 
    mail_to = 'email1; email2; email3,... important people.....',
    mail_subject = 'Whatever subject',
    mail_comment = 'Whatever comment',
    include_report = 'True'

ELSE -- the world is a dark place, variable is probably 1 or something. bad...

SELECT 
    mail_to = 'someone you don''t like',
    mail_subject = 'something is bad' + LEFT(CONVERT(VARCHAR(25), GETDATE(), 20),16),
    mail_comment = 'like i said, something is bad',
    include_report = 'False'

答案 2 :(得分:0)

请使用以下脚本来停止SSRS中的空白调度程序报告:

BEGIN


Select @PN=Count(ParameterName) from setup   where 

@SAPProcessedDate<>parametervalue   and parametername='CommunicatorLastRun'

IF @PN = 0

    Select 1/0

Else 

Select 'Communicator Not Running' AS ParameterName


END

答案 3 :(得分:0)

我发现的工作非常容易实现,只需在查询中包含一个除以行数的额外字段。如果计数为零,则会得到除以零的错误,并且不会发送电子邮件;如果计数至少为1,那么报告运行正常,电子邮件就会消失。

SELECT 
  [table].[id]
  ,(1/COUNT(id))
FROM [table]
WHERE [table].[id] > @Parameter

关于这种技术的一个注意事项是,它确实增加了一些额外的开销,因此如果您预计可能存在非常大的数据集,则可能不合适。

答案 4 :(得分:0)

这里有些细微之处,但是Wayne的答案非常有用,可以正确地指示我的方向,以至于我必须添加此调整,该调整只能在刷新每日数据后运行报表(数据刷新过程不在我的脑海中)。控制,但我可以读取其成功/失败状态。

/*eslint-disable */
import DashboardLayout from '../layouts/DashboardLayout';

//after all import statements, you enable eslint.
/*eslint-enable */

然后将此行添加到常规查询的WHERE子句中:

DECLARE @processSuccess TINYINT = 0;
SET @processSuccess = 
(
    SELECT TOP 1 1
    FROM processesTrackerTable
    WHERE ID = 25
    AND State = 'Success'
    AND CAST(RunEndDtm AS DATE) = CAST(GETDATE() AS DATE)
    ORDER BY RunID DESC
 )

这将直接从SSRS查询中强制报告失败,从而使用户不会收到陈旧或空白的报告。