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



我在SSRS 2008 R2中使用数据驱动订阅来调度一些报表。

无论生成的报表是否为空,都将报表发送给接收方。这一直是一个常见的问题很长一段时间,说实话,我在论坛上看到的建议并没有完全解决。

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

以前有人用过这种方法吗?如果是这样,你能告诉我我在这里遗漏了什么吗?

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

非常感谢你的帮助。

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

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

查看Russell Christopher的文章和评论了解更多细节。让我吃惊的是,6年过去了,微软还是没能拿出一个解决方案。

我发现很容易实现的工作是简单地在您的查询中包含一个额外的字段,除以行数。如果计数为零,那么你得到一个除以零的错误,电子邮件不会发送;如果计数至少为1,则报告运行正常,电子邮件发出。

SELECT 
  [table].[id]
  ,(1/COUNT(id))
FROM [table]
WHERE [table].[id] > @Parameter
该技术需要注意的一点是,它确实增加了一些额外的开销,因此,如果您期望非常大的数据集的可能性,它可能不合适。

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

例如:

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'

请使用下面的脚本停止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

在这里死灵了,但Wayne的回答是如此有帮助,为我指出了正确的方向,我不得不添加这个调整,这工作只运行报告时,每日数据已经刷新(数据刷新过程不在我的控制,但我可以读取其成功/失败状态)。

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
 )

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

AND 1 = 1/COALESCE(@processSuccess, 0)

这会直接从SSRS查询强制报告失败,这样用户就不会得到过期或空白的报告。

最新更新