首页 > 解决方案 > SSRS:底层 SQL 使用“union all”——结果集比预期的要小得多——加上比 Tablix 过滤更好的方法

问题描述

我正在使用带有底层 TSQL 的 SSRS、Visual Studio 2015。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 语句运行查询时,它的速度非常快,并且返回 12 个结果。

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

 Set Rowcount 1000

陈述。但是,它只返回 1 个结果,而不是 12 个。如果我删除“设置行数”选项,则不会发生任何可用的事情,并且“正在加载”消息只有一个旋转图标。

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

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

注意:有比原始问题中提出的更好的方法。可以在 SQL where 查询中进行过滤,而不是 tablix 过滤。请参阅 OP 的答案。

标签: sql-servertsqlreporting-servicesfilteringssrs-tablix

解决方案


查询根本没有被修改。数据集查询运行并返回所有结果,就像您在 SSMS 中运行查询一样。如果您的 tablix 上有过滤器,则该过滤器仅适用于该 tablix。您可以拥有另一个报表项,例如 tablix 或图表,甚至指向同一个数据集,每个数据集都有自己的过滤器。

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

如果您的数据集查询在 SSRS 中仍然运行缓慢,请尝试使用 Profiler(从 SSMS 工具菜单中)对连接进行跟踪,并检查正在执行的 SQL 是否符合您的预期。

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


推荐阅读