SSRS:基础 SQL 使用 'union all'——结果集比预期小得多——加上比 Tablix 过滤更好的方法

SSRS: Underlying SQL uses 'union all' -- results are much smaller set than expected -- plus better way than Tablix-filtering

我正在使用 SSRS,Visual Studio 2015,底层 TSQL。 SSRS 使用 2016/01/reportdefinition.

我需要使用基础 SQL 语句过滤参数(使用带 'like' 选项的 tablix 过滤器):

SELECT col1 as result1, col2 as result2 FROM table1
UNION all
SELECT colA as result1, colB as result2 FROM table 2
order by result1

类似 Tablix 的语句是:

="*" + Parameters!Result1.Value + "*"

我会假设该参数会导致基础where子句应用于上述UNION all中的两个SQL语句,但我不肯定知道这一点。 [此假设正确:请参阅下面的答案]

项目的 SQL 服务器是 SQL Server 2008 R2、2012 或 2014。

无论如何,当我 运行 使用 SSMS [v 17.7] 中的 where 语句进行查询时,它非常快并且 returns 12 个结果。

但是当我 运行 在 SSRS 的 rdl 文件预览中查询时,非常 慢。因此,我使用的是:

 Set Rowcount 1000

声明。但是,它只有 returns 1 个结果,而不是 12 个。如果我删除 "Set Rowcount" 选项,则不会发生任何可用的事情,并且 "Loading" 消息只有一个旋转图标。

有没有人知道如何修改查询以过滤参数,以及为什么返回的结果比预期少?

可能性: 是否 运行 没有 where 的查询,将结果限制为 1000,然后,根据涉及的顺序,排除几个潜在的结果匹配? [这 可能性 实际上会发生什么,请参阅下面的答案]

注意:有一种比原始问题中询问的方法更好的方法。除了 tablix 过滤之外,还可以在 SQL where 查询中进行过滤。请参阅 OP 的回答。

查询根本没有修改。数据集查询 运行s 和 returns 所有结果与您在 SSMS 中进行 运行 查询的结果相同。如果您的 tablix 上有过滤器,则该过滤器仅适用于该 tablix。您可以有另一个报告项目,例如 tablix 或图表,甚至指向同一个数据集,每个数据集都有自己的过滤器。

您的查询可能使用了错误的计划,您应该能够通过在数据集查询的末尾添加 OPTION (RECOMPILE) 来轻松地进行测试。这将强制重新创建计划。不要设置行数,否则你将得不到真正的测试。

如果您的数据集查询在 SSRS 中仍然 运行 缓慢,请尝试使用探查器(从 SSMS 工具菜单)对连接进行跟踪,并检查正在执行的 SQL如你所愿。

如果这没有帮助,请 post 完整的查询以便对其进行评估(我假设您的实际查询不是您在问题中所说的...)

虽然 Alan Schofield 对问题的回答是完整的,但还有比原始问题更好的方法。

到目前为止,它是匹配参数的更好选择。

为此,可以在 rdl 文件的适当位置使用以下 xml 语法:

<DataSets>
    <DataSet Name="DataSet1">
      <Query>
        <DataSourceName>MyDataSource</DataSourceName>
        <QueryParameters>
          <QueryParameter Name="@Result">
            <Value>=Parameters!Result.Value</Value>
          </QueryParameter>
        </QueryParameters>
        <CommandText>
          --------------------------------------------------------------------
          use MyDataSource;
          --------------------------------------------------------------------
          select col1 as result1,  col2 as result2 from table1 a
          where  col1 LIKE '%' + @Result + '%'
          Union all
          select colA as result1,  colB as result2 from table2 b
          where  colA  LIKE '%' + @Result + '%'
          order by  result1,  
          --------------------------------------------------------------------</CommandText>
        <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
      </Query>