我正在使用SSRS 2008 R2中的数据驱动订阅安排一些报告。
无论生成的报告是否为空,报告仍会发送给收件人。这是一个长期存在的常见问题,老实说,我在论坛上看到的建议并没有完全解决。
我尝试过的其中一个建议是,我创建了一个隐藏参数,并将其设置为默认值选项卡中主数据集上的字段。如果报告为空则抛出错误,如果报表设计器中显示某些数据,则生成报表。但是,当我安排此报告时,它会要求我提供默认值,如果不提供它,我就无法完成调度程序向导。如果我提供任何默认值,则仍会发送空报告。但与此不同的是,应该为空报告抛出错误,不应发送它们。
以前有人用过这种方法吗?如果是的话,你能告诉我我在这里失踪了吗?
我只是想知道你们是否有一个理想的解决方案来解决这个问题。
非常感谢你的帮助。
此致
答案 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查询中强制报告失败,从而使用户不会收到陈旧或空白的报告。