2

我可以使用将隐藏/显示子报告的表达式设置隐藏属性,但我使用 SQL Profiler 发现,即使子报告被隐藏,子报告存储过程仍会执行。

除了更改存储过程本身之外,是否有人知道避免这种情况的方法。如果没有,即使隐藏子报告,是否有人知道执行存储过程的原因?

这与此问题相同,但没有答案,所以我再次询问任何帮助都会很棒

4

2 回答 2

6

我有一个大型复杂报告(最多 10k 控制行),其中 7 个子报告中有 1:n 行。除非您可以抑制子报表中的 SQL 执行(因为大多数子报表大部分时间都是隐藏的),否则这会像狗一样运行。

经过一番痛苦,我发现抑制子报表渲染和数据集执行真的很容易。您所需要的只是子报表中的必需报表参数。通常有一个 ID 字段传递给子报表,所以这应该没有问题。

在主报告中,参数通过类似于以下的表达式传递:

=Iif(Fields!SubReportXisHidden.Value,Nothing,Fields!ID.Value)

子报表将提示缺少参数,不会呈现并且不会执行 SQL。

深深的喜悦!

于 2014-07-18T16:01:58.010 回答
0

只需在 SQL Management Studio 中执行该逻辑即可。SSRS 并不是一个真正的事件驱动系统,您可以在代码块中和使用 Visual Basic 做一些小事情,但不多。它并不意味着在复杂的 if then else 场景上编写执行计划级别的编码,以便在运行时执行计划。事实上,如果您尝试进行高级循环和索引,它会变得很疯狂,因为这对于服务器来说不仅仅是这个附加功能。它旨在展示您提供给它的数据以及一些非常基本的元素条件。如果您真的想进行查询及其成本,或者不只是向 SQL Management Studio 中创建的 proc 添加一点翻转,例如:

create procedure dbo.ToCreateOrNotToCreate 
    (
        @input varchar(32)
    ,   @Run bit
    )
as 

BEGIN
    if @Run = 1 
        Select 'You selected to run "' + @input + '" at a cost!'
    else 
        Select 'Don''t run and save performance'
END


exec dbo.ToCreateOrNotToCreate @input = 'My Input', @Run = 1
exec dbo.ToCreateOrNotToCreate @input = 'My Input', @Run = 0
于 2013-08-14T15:57:09.720 回答