【问题标题】:sql server data-driven subscription stop sendingsql server 数据驱动订阅停止发送
【发布时间】:2010-11-05 13:42:39
【问题描述】:

我有一份每小时检查新订单的报告。但是效果很好,我只想在至少有一个订单的情况下发送报告。如果报告为空 - 我根本不想发送报告。

为了扩展这一点,我只想在有新订单时发送报告。

想法?

【问题讨论】:

    标签: sql sql-server ssrs-2008 sql-server-2008-r2


    【解决方案1】:

    只需在您的 DDS 查询中添加一个条件即可检查订单时间。如果过去一小时内有任何订单,您的查询应该返回您的结果集,否则什么也不返回。

    例如,在您的查询中添加以下逻辑

     DECLARE @HoursAgo int
     SELECT Top 1 @HoursAgo = DateDiff('hh',getdate(), OrderTime) 
     FROM Orders 
     ORDER BY OrderTime DESC  
    

    在您的查询中添加以下子句

     WHERE @HoursAgo > 0
    

    您可能还需要添加额外检查以确保订单来自当天。

    【讨论】:

    • 这还不发送空报告吗?
    • 你不要把它放在报表数据集中。当您定义数据驱动订阅时,它会要求您提供一个查询,该查询可用于确定电子邮件收件人、格式等。对于从该查询返回的每一行,都会处理和交付订阅。如果查询未返回任何结果,则不会发送订阅。
    • 澄清一下。我指的是数据驱动订阅创建过程中的第 3 步。
    【解决方案2】:

    如果数据集没有返回任何行,则 RDL 数据集有一个名为“noRows”的属性可以显示自定义消息。它仍然会发送空报告,只是带有一条特殊消息。

    如果您希望订阅不触发报告,那么我知道的唯一方法是在您的存储过程中检查 select 语句的行数,如果行数为零则抛出错误。这不是一个优雅的方法,但它不会发送报告,因为错误发生在 T-SQL 端并且 SSRS 将无法呈现报告。

    declare @rows int
    
    select @rows = -1
    
    <select statement here>
    
    select @rows = @@rowcount
    
    if ( @rows < 1 )
    begin
        RAISERROR ('no rows returned', 11, 1 );
    end
    

    【讨论】:

    • 这在数据驱动订阅中不是必需的。您无需触摸报表定义。相反,您修改定义订阅参数的查询
    • 正确,这是另一种处理方式。
    猜你喜欢
    • 2022-01-11
    • 2012-09-26
    • 1970-01-01
    • 2012-06-03
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多