我正在处理SQL Server报告,该报告显示大小为300 K的数据,因此在报告处理上大部分时间都非常慢。所以我想我是否可以做一些程序来从每页的数据库中获取数据。这种方式从db调用并且报表处理时间会减少。换句话说,如果我每页显示50条记录,当我在第一页并点击第2页或下一个按钮时,我的报告将数据从51提取到100.当我再次点击下一个按钮然后我得到第3页的数据为101到150。
那么我有什么方法可以实现。
答案 0 :(得分:0)
通常在呈现报表时,会提取所有数据并且SSRS会呈现导致延迟的报表。如果性能是这里的关键,您可以使用存储过程一次检索50行,而不是将所有值直接传递给SSRS - 请注意,此处您将无法使用本机的下一页/上一页按钮。
解决方法是创建自定义链接以循环回报告本身,并使用递增的参数指定要从中开始的索引行。
创建一个存储过程,该过程接受一个参数,该参数指定表中的起始行:
CREATE PROCEDURE dbo.usp_GetData
@RowNumber BIGINT
AS
BEGIN
DECLARE @FirstRow BIGINT
DECLARE @LastRow BIGINT
SET @FirstRow = @RowNumber
SET @LastRow = @RowNumber + 50
;WITH CTE AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY num) AS RowNumber
FROM dbo.TestTable
)
SELECT *
FROM CTE
WHERE RowNumber >= @FirstRow
AND RowNumber < @LastRow
END
GO
创建一个存储过程,从表中检索总行数:
CREATE PROCEDURE dbo.usp_GetTotalRows
AS
BEGIN
SELECT COUNT(*) "TotalRows"
FROM dbo.TestTable
END
GO
创建报告并使用两个存储过程添加两个数据集。
应自动生成@RowNumber
参数。您可以将默认值设置为1以从第1行开始报告。
在报告上创建两个“自定义”按钮(实际上只是链接回同一报告)。您可以使用上一页/下一页按钮的文本框。
对于“上一个按钮”文本框 - 属性&gt;行动&gt;转到报告&gt;指定报告(选择报告名称的名称)。添加参数并将表达式设置为:
=Parameters!RowNumber.Value-50
对于“下一个按钮”文本框 - 属性&gt;行动&gt;转到报告&gt;指定报告(选择报告名称的名称)。添加参数并将表达式设置为:
=Parameters!RowNumber.Value+50
您还可以更改按钮的可见性选项(例如在Parameters!RowNumber.Value = 1
时隐藏“上一页”按钮,或在Parameters!RowNumber.Value + 50 >= DataSetName!TotalRows.Value
时隐藏“下一页”按钮