我必须处理可能很大的记录列表,并且我一直在谷歌搜索避免选择整个列表的方法,相反,我想让用户选择一个页面(例如从 1 到 10)并相应地显示记录。
比如说,对于 1000 条记录,我将有 100 页,每页 10 条记录,并且将首先显示最近的 10 条记录,然后如果用户单击第 5 页,它将显示从 41 到 50 的记录。
为每条记录添加行号然后根据行号进行查询是一个好主意吗?有没有更好的方法来实现分页结果而不需要太多开销?
到目前为止,这里描述的这些方法看起来最有前途:
http://www.codeproject.com/KB/aspnet/PagingLarge.aspx http://www.codeproject.com/KB/aspnet/PagingLarge.aspx
以下 T-SQL 存储过程是very高效实现分页。 SQL优化器可以非常快地找到第一个ID。将此与 ROWCOUNT 的使用结合起来,您将获得一种既具有 CPU 效率又具有读取效率的方法。对于具有大量行的表,它肯定胜过我见过的使用临时表或表变量的任何方法。
注意:我在本例中使用了顺序标识列,但代码适用于任何适合页面排序的列。此外,所使用的列中的序列中断不会影响结果,因为代码选择了许多行而不是列值。
编辑:如果您要对具有潜在非唯一值(例如 LastName)的列进行排序,则将第二列添加到 Order By 子句以使排序值再次唯一。
CREATE PROCEDURE dbo.PagingTest
(
@PageNumber int,
@PageSize int
)
AS
DECLARE @FirstId int, @FirstRow int
SET @FirstRow = ( (@PageNumber - 1) * @PageSize ) + 1
SET ROWCOUNT @FirstRow
-- Add check here to ensure that @FirstRow is not
-- greater than the number of rows in the table.
SELECT @FirstId = [Id]
FROM dbo.TestTable
ORDER BY [Id]
SET ROWCOUNT @PageSize
SELECT *
FROM dbo.TestTable
WHERE [Id] >= @FirstId
ORDER BY [Id]
SET ROWCOUNT 0
GO
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)