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当我在 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 中单独字段的值有条件地格式化整行的文本颜色?