Report Builder 3.0 - 如何使用大型数据集运行此报告?

Posted

技术标签:

【中文标题】Report Builder 3.0 - 如何使用大型数据集运行此报告?【英文标题】:Report Builder 3.0 - How can I run this report with a large data set? 【发布时间】:2020-06-26 13:08:32 【问题描述】:

我是使用大量数据开发报告的新手,所以我正在寻找一些关于我遇到的问题的建议。

我正在开发一个包含 6 个参数的 s-s-rS 报告。每个参数都有自己的数据集,为参数指定不同的值列表。

用户可以为每个参数选择任意数量的值,但 1(日期)除外。

查询看起来像这样;

SELECT [CURR].[PERIOD]
,[CURR].[PERIOD_MTD]
,[CURR].[CATEGORY1]
,[CURR].[CATEGORY2]
,[CURR].[CATEGORY3]
,[CURR].[CATEGORY4]
,[CURR].[CATEGORY5]
,[CURR].[CALCULATION1_ITD]
,[CURR].[CALCULATION2_ITD]
,[CURR].[CALCULATION3_ITD]
,[CURR].[CALCULATION4_ITD]
,[CURR].[CALCULATION1_MTD]
,[CURR].[CALCULATION2_MTD]
,[CURR].[CALCULATION3_MTD]
,[CURR].[CALCULATION4_MTD]
FROM [BIG_TABLE] [CURR] LEFT OUTER JOIN
[BIG_TABLE] [PREV M]
    ON [CURR].[PERIOD_MTD] = [PREV M].[PERIOD]
    AND [CURR].[CATEGORY1] = [PREV M].[CATEGORY1]
    AND [CURR].[CATEGORY2] = [PREV M].[CATEGORY2]
    AND [CURR].[CATEGORY3] = [PREV M].[CATEGORY3]
    AND [CURR].[CATEGORY4] = [PREV M].[CATEGORY4]
    AND [CURR].[CATEGORY5] = [PREV M].[CATEGORY5]
WHERE [CURR].[PERIOD] = @YYYYMM
AND [CURR].[CATEGORY1] IN (@PARAMETER1)
AND [CURR].[CATEGORY2] IN (@PARAMETER2)
AND [CURR].[CATEGORY3] IN (@PARAMETER3)
AND [CURR].[CATEGORY4] IN (@PARAMETER4)
AND [CURR].[CATEGORY5] IN (@PARAMETER5)

这是我遇到的问题; 1 个参数有一个包含 5,500 多个值的不同列表,用户可以从中进行选择。选择所有值后,我注意到参数字段不像其他字段那样填充(下图)。

报告运行时,我收到以下错误:

此消息非常含糊,但我将其隔离为这样一个事实,即报告将在此参数中使用较少的值运行,但不是全部。

我不确定还可以尝试什么。我认为这可能是通过主数据集获取大量数据的问题。

额外信息:

通过与 SharePoint 的共享连接访问数据源

为此报告查询的表没有索引。我想知道这是否重要,因为该表大约有 26.5mill 行。

【问题讨论】:

当您在报表服务器上检查错误时,它告诉您什么? 如何将参数传递给主查询?请编辑问题以显示 dsMain 数据集查询。 @Larnu 我认为我没有能力做到这一点。我无法更改服务器的设置以启用远程错误。 @AlanSchofield 参数被插入到 WHERE 子句 IN (@parameter) 中。我将编辑问题以显示这一点。 您不会在 SSMS 中看到它们,不会。如果您无法访问服务器,我建议您与可以访问服务器的人交谈,因为他们可以告诉您错误。 【参考方案1】:

我建议你的方法是错误的。

如果您向用户展示一个包含 5000 多个项目的列表以供选择,我猜他们要么会选择其中的一小部分,要么会选择全部,他们不太可能会坐在那里选择列表中的 100 项。

如果是这种情况,那么我建议将“ALL”选项附加到列表中(UNION 到您的原始列表中),然后像这样修改查询...

WHERE [CURR].[PERIOD] = @YYYYMM
AND (@PARAMETER1 = 'ALL' OR [CURR].[CATEGORY1] IN (@PARAMETER1))
...
...

您可能还想阅读这些以前的 SO 问题和 MS 文章。

"IN" clause limitation in Sql Server

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/in-transact-sql?view=sql-server-ver15

【讨论】:

感谢您的文章!我认为这些与我的问题有关。我对您的查询建议感到困惑。当参数设置为“ALL”时,该参数如何识别主数据集中的记录?是否不必在主数据集中查找列具有“ALL”作为其值的记录? (我已经尝试过了,报告返回空白)此外,允许多个值的参数已经有一个“全选”选项,它将一个包含所有可能参数值的字符串输入到 where 子句中。这是一种替代方法吗? 手动添加的 'All' 选项不同,因为只有一个条目将传递给查询,参数将只包含 'Al'' 而不是 'option1'、'option2'、'option3'等...通过更改 where 子句来检查文字值“ALL”,我们只是说,如果参数是“all”,则选择记录。在一个小样本上尝试这个,在 SSMS 中只有几个参数来测试它。确保括号在正确的位置!如果您有问题,请告诉我,我会发布更长的示例/说明

以上是关于Report Builder 3.0 - 如何使用大型数据集运行此报告?的主要内容,如果未能解决你的问题,请参考以下文章

打开查询设计器时,Report Builder 3.0会冻结

谁知道如何将报表保存到报表服务器 (Report Builder 3.0)

从 Report Builder 3.0 连接到 Oracle 数据库

Tablix:在每个页面上重复标题行不起作用 - Report Builder 3.0

s-s-rS Report Builder 3.0 - 每个系列的平均带状线

请教如何在Report Builder 中设置多个参数