【问题标题】:SSRS run SQL/DataSet conditionallySSRS 有条件地运行 SQL/DataSet
【发布时间】:2011-03-05 01:35:46
【问题描述】:

我有一份 SSRS 报告,其中包含多个子报告。用户可以使用几个布尔参数来选择/取消选择他们想要生成的子报告。如果取消选择子报表,则不会通过设置 Visibility 属性来呈现它。但是,与取消选择的子报表关联的 DataSet 仍会执行,导致执行时间比预期的要长。

有没有办法告诉子报表或 Tablix 上的数据集不要根据参数选择执行?

【问题讨论】:

    标签: reporting-services upload dataset conditional


    【解决方案1】:

    在 where 子句中包含 AND :ParameterName = 'Y' 条件 - 如果您的参数不是 'Y',查询仍会触发,但会立即返回 0 条记录。

    【讨论】:

    • 很酷的交易...我会试一试,让您知道进展如何。谢谢
    • 嗨,马克...我已经尝试过这种方法,它的工作原理是在参数 'Y' 时返回零行。但是,执行时间大致相同。您认为查询仍会发送到服务器吗?
    • 它将被发送到服务器,但服务器上的优化器应该立即识别出需要 0 条记录并返回一个空数据集。你得到什么执行时间?
    • 有趣....当我取消选择 12 个报告时...执行时间约为 30 秒。当我选择所有 12 个报告时,它是相同的(给或需要 1 秒)
    • 为了更准确....29 秒,所有“取消选择”。 36 秒全部“选中”。
    【解决方案2】:

    是的。只需检查每个数据集中的参数并使用 IF/ELSE 构造返回相同形状的实际数据或虚拟数据以防止错误。假设您的参数名为@ShowThisData,那么您可以这样做:

    IF @ShowThisData = 0
        SELECT '' FIELD1, '' FIELD2, <etc... to create a dataset that matches the normal output.>
    ELSE
        <whatever you normally do to get the data>
    

    【讨论】:

    • 好酷...你把条件代码放在数据集中的什么地方。我在查询文本中尝试过,但它不喜欢那样。我也查看了 DataSet 的 filter 属性。那是它应该去的地方吗?
    • 错误 id "ORA-00900: invalid SQL statement" if @Parameter = 'true' select * FROM where running_total_pct
    • 哦,甲骨文。抱歉,我不应该假设 MSSQL。我不认为你在使用 Oracle 时在数据集中有那么大的权力。试试 Mark Ba​​nnister 更简单的方法。
    • 想想看,你仍然可以使用类似的方法。数据集查询文本可以是一个表达式,而 IIF() 表达式可以根据参数提供不同的查询文本。但对于基本查询,我认为 Mark 的解决方案要简单得多
    • 要对查询文本使用表达式,您需要 =IIF(Parameters!ParameterName.Value=True,"NORMAL SQL HERE","DUMMY SQL HERE") 然后您必须确保您正确处理 SQL 中任何嵌入的双引号。
    【解决方案3】:

    当我在 Oracle 中尝试时,这很有效

    select
    case when :ShowThisData = 0
            then    (SELECT 'Y' 
                        from dual)
        ELSE    (select 'N'
                  from dual)
    end test1
    from dual
    

    允许您在 1 个查询中使用多个语句

    【讨论】:

    • 如果您想要多列,您将如何应用到您的查询?这在 mssql 中很简单,我是 Oracle 的新手。提前致谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多