代码之家  ›  专栏  ›  技术社区  ›  JosephDoggie

SSRS:底层SQL使用“union all”,结果集比预期小得多,而且比Tablix过滤更好

  •  1
  • JosephDoggie  · 技术社区  · 6 年前

    我正在使用SSRS、visualstudio2015和底层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中的两个SQL语句,但我不确定这一点[这个假设是正确的 正确:参见下面的答案]

    项目的SQL server为SQL server 2008 R2、2012或2014。

    无论如何,当我用SSMS[v17.7]中的where语句运行查询时,它非常快,返回12个结果。

    极其 慢点。因此,我使用:

     Set Rowcount 1000
    

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

    可能性:

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alan Schofield    6 年前

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

    您的查询可能使用了错误的计划,您应该能够通过在数据集查询的末尾添加选项(重新编译)来轻松地测试这一点。这将迫使重新创建计划。不要设置行数,否则将无法得到真正的测试。

    如果没有帮助,请张贴完整的查询,以便它可以评估(我假设你的实际查询不是你在你的问题中所说的…)

        2
  •  0
  •   JosephDoggie    6 年前

    虽然艾伦·斯科菲尔德对这个问题的回答是完整的,但有一个比原来的问题更好的方法。

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

    <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>