sql-server - 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 的答案。
解决方案
查询根本没有被修改。数据集查询运行并返回所有结果,就像您在 SSMS 中运行查询一样。如果您的 tablix 上有过滤器,则该过滤器仅适用于该 tablix。您可以拥有另一个报表项,例如 tablix 或图表,甚至指向同一个数据集,每个数据集都有自己的过滤器。
您的查询可能使用了错误的计划,您应该能够通过将 OPTION (RECOMPILE) 添加到数据集查询的末尾来轻松测试这一点。这将迫使重新创建计划。不要设置行数,否则您将无法获得真正的测试。
如果您的数据集查询在 SSRS 中仍然运行缓慢,请尝试使用 Profiler(从 SSMS 工具菜单中)对连接进行跟踪,并检查正在执行的 SQL 是否符合您的预期。
如果这没有帮助,请发布完整的查询以便对其进行评估(我假设您的实际查询不是您在问题中所说的......)
推荐阅读
- javascript - 工资税如何计算
- vue.js - 关闭有关 vue 的浏览器或页面
- c# - 为什么两个glcontrols的OnPaint事件不同步运行 - opentk c#
- python - 如何在 Pycharm 和 Django 上调试此错误
- ruby - 使用define_method时块中的实例变量
- image - 在机器学习中训练/评估时,图像文件类型在准确性或速度方面是否重要?
- asp.net-core - 更改 ASP.NET Core Razor 页面中的默认登录页面?
- java - 在 Maven 项目中导入 Cplex 库时如何修复“IncompatibleClassChangeError:Implementing Class”?
- java - 获取 @RestController 中使用的 ObjectMapper
- amazon-web-services - 气流集群:是否需要在所有工作人员中部署 DAG / 工作流?