Stored procedures 基于参数在SSRS中隐藏子报表(不执行存储过程)

Stored procedures 基于参数在SSRS中隐藏子报表(不执行存储过程),stored-procedures,reporting-services,hide,subreport,Stored Procedures,Reporting Services,Hide,Subreport,我有一个问题,我希望根据传递给主报告的参数隐藏/显示子报告 我可以使用一个将隐藏/显示子报表的表达式来设置hidden属性,但我使用SQL Profiler发现,即使子报表是隐藏的,子报表存储过程仍然会执行 除了更改存储过程本身,是否有人知道避免这种情况的方法。 如果没有,即使子报表是隐藏的,是否有人知道执行存储过程的原因?SSR中隐藏的报表元素仍在处理中-hidden属性仅确定它们是否显示在输出中 确保过程仅以有条件的方式执行的一种方法是将数据集中存储过程的名称更改为表达式—类似于: =iif

我有一个问题,我希望根据传递给主报告的参数隐藏/显示子报告

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

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

SSR中隐藏的报表元素仍在处理中-hidden属性仅确定它们是否显示在输出中

确保过程仅以有条件的方式执行的一种方法是将数据集中存储过程的名称更改为表达式—类似于:

=iif(Parameters!RunMyDataset.Value="Y","sp_MyDataSet","sp_Dummy")
-其中sp_Dummy是执行最小处理的存储过程(例如,
SELECT NULL

  • 右键单击主报表中的子报表对象,然后选择“格式化子报表…”。这将打开格式编辑器

  • 在格式编辑器中选择“子报告”选项卡

  • 选中“抑制空白子报表”复选框


  • 有一种方法可以解决这个问题。根据你对问题的描述。例如,您有4个子报告,并将其命名为page1到page4。主报告将把参数“Investor_ID”值传递给所有这4页。在主报表中,需要创建4个布尔参数并设置子报表的隐藏属性,以控制这4个子报表是否可见

    例如,使用表达式
    =iif(Parameters!Page1.Value=true,false,true)
    以便在为参数Page1选择true时,将显示Page1,否则将隐藏它

    然后,您需要在子报表的“子报表属性”中配置参数

    对于子报表需要的参数Investor\u ID,在值中选择expressing并使用
    =IIF(Parameters!Page1.value=true,Fields!Investor\u ID.value,nothing)
    。这意味着,如果选择“隐藏页面1”,则mainreport不会向子报表页面1传递任何内容。然后Page1将不会运行,并将显示“错误:无法显示子报告”,因为Investor_ID参数为空。但我们隐藏了那个子报告。所以第1页不会出现


    通过这种方式,您可以控制隐藏的子报表是否执行

    虚拟sp是否不必返回与原始sp相同的列?@astander:如果不必返回,则在投标中预览时,报告将生成大量警告(但没有错误)。因此,理想情况下,在虚拟过程中生成相同的列集是一个好主意(以防止生成这些警告),但这不是必需的。这意味着我必须为每个子报告/sp创建一个虚拟sp,并且必须为每个需要隐藏的子报告维护2个sp。您知道MS决定强制执行SP的原因吗?无论如何,我得想点别的,因为我不想让SP内置显示逻辑以提高可视性。@astander:正如我所说,这不是必需的。您可以使用一个虚拟存储过程,只需忽略警告(我不希望最终用户看到这些警告),这对我来说仍然是一种攻击。如果您可以完全根据请求避免SP调用,则会更好。