Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 停止在SSRS 2008 R2数据驱动订阅中发送空报告_Sql Server 2008_Reporting Services_Ssrs 2008 - Fatal编程技术网

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

Sql server 2008 停止在SSRS 2008 R2数据驱动订阅中发送空报告,sql-server-2008,reporting-services,ssrs-2008,Sql Server 2008,Reporting Services,Ssrs 2008,我正在使用SSRS 2008 R2中的数据驱动订阅来安排一些报告 无论生成的报告是否为空,报告仍会发送给收件人。这是一个很长时间以来普遍存在的问题,老实说,我在论坛上看到的建议并没有完全奏效 我尝试过的其中一个建议是,我创建了一个隐藏参数,并将其设置为“默认值”选项卡中主数据集的一个字段。如果报表为空,则抛出错误;如果报表设计器中有一些数据要显示,则生成报表。但是,当我计划此报告时,它会要求我提供默认值,如果不提供该值,我将无法完成计划程序向导。如果我提供任何默认值,空报告仍然会被发送。但与此不

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

无论生成的报告是否为空,报告仍会发送给收件人。这是一个很长时间以来普遍存在的问题,老实说,我在论坛上看到的建议并没有完全奏效

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

以前有人用过这种方法吗?如果是这样的话,你能告诉我这里缺少什么吗

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

非常感谢你的帮助


关于

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

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

查看更多详细信息。令我惊讶的是,已经过去6年了,MS却无法找到解决方案:3种方法可以实现这一点。根据查询结果很容易更改订阅的行为。只需查询您的数据库以了解情况,例如在进程日志中,或者只需从您必须运行的过程返回状态,并使用if语句

例如:


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

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

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

关于这项技术的一个注意事项是,它确实增加了一些额外的开销,因此,如果你认为可能会有非常大的数据集,那么它可能不合适。

这里的亡灵巫术,但是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查询强制报告失败,这样用户就不会得到陈旧或空白的报告

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