s-s-rS 有条件地运行 SQL/DataSet

Posted

技术标签:

【中文标题】s-s-rS 有条件地运行 SQL/DataSet【英文标题】:s-s-rS run SQL/DataSet conditionally 【发布时间】:2011-03-05 01:35:46 【问题描述】:

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

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

【问题讨论】:

【参考方案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 的新手。提前致谢。

以上是关于s-s-rS 有条件地运行 SQL/DataSet的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 s-s-rS 中单独字段的值有条件地格式化整行的文本颜色?

当其中一个在s-s-rS中有条件地不可见时如何隐藏文本框之间的空白

在 s-s-rS 中使用分页符时有条件地隐藏列

s-s-rS 条件格式开关或 IIF

在 s-s-rS 中,如何使用多值参数创建动态“位置”条件

s-s-rs参数表达式条件