我可以使用隐藏/显示子报表的表达式来设置隐藏属性,但是我使用SQL Profiler发现的是,即使子报表被隐藏,子报表存储过程仍然会被执行
除了更改存储过程本身之外,是否有人知道避免这种情况的方法。如果没有,是否有人知道存储过程被执行的原因,即使隐藏了子报告?
这个问题与This one相同,但没有答案,所以我再次要求任何帮助都会很棒
答案 0 :(得分:6)
我有一个大型的复杂报告(最多10k控制行),其中7个子报告中有1:n行。除非您可以在子报表中禁止SQL执行,因此它会像狗一样运行(因为大多数时候大多数子报表都是隐藏的)。
经过多次痛苦之后,我发现抑制子报表渲染和数据集执行非常容易。您所需要的只是子报表中的必需报表参数。通常会有一个ID字段传递给子报表,所以这应该没问题。
在主报告中,参数通过类似于:
的表达式传递= IIF(字段!SubReportXisHidden.Value,没什么,字段!ID.Value)
子报表将对缺少的参数进行barf,不会渲染,也不会执行SQL。
深深的喜悦!
答案 1 :(得分:0)
在SQL Management Studio中执行该逻辑。 SSRS实际上不是一个事件驱动的系统,你可以在代码块和Visual Basic中做一些小事,但不是很多。如果在运行时执行计划中执行其他方案,则无意对复杂的程序执行计划级编码进行编程。事实上,如果你尝试进行高级循环和索引,它就会生气,因为这对于服务器来说比这个更多。它旨在呈现您提供给它的数据以及一些非常基本的元素条件。如果你真的想要查询它或者它的成本是否只是添加一点翻转到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