Sql server 使用起始和长度参数对SQL 2000进行分页的好方法是什么?

Sql server 使用起始和长度参数对SQL 2000进行分页的好方法是什么?,sql-server,stored-procedures,sql-server-2000,pagination,Sql Server,Stored Procedures,Sql Server 2000,Pagination,我的任务是重构现有的存储过程,以便对结果进行分页。SQL server是SQL 2000,因此我不能使用分页的行数方法。存储的过程已经相当复杂,在执行sp_executesql之前将大型sql语句的块构建在一起,并且有各种排序选项可用 这似乎是一个很好的方法,但我认为这个例子是错误的,因为第二种排序需要反转,并且当起始值小于pagelength时,情况会发生故障。该页面上的第二个示例似乎也是一个不错的方法,但SP采用的是页码而不是起始记录。而整个临时工作台的事情似乎将是一个性能消耗 我在这条道路

我的任务是重构现有的存储过程,以便对结果进行分页。SQL server是SQL 2000,因此我不能使用分页的行数方法。存储的过程已经相当复杂,在执行sp_executesql之前将大型sql语句的块构建在一起,并且有各种排序选项可用

这似乎是一个很好的方法,但我认为这个例子是错误的,因为第二种排序需要反转,并且当起始值小于pagelength时,情况会发生故障。该页面上的第二个示例似乎也是一个不错的方法,但SP采用的是页码而不是起始记录。而整个临时工作台的事情似乎将是一个性能消耗

我在这条道路上取得了进展,但它似乎缓慢而混乱,我不得不在排序上做相当多的替换方法,以使其正确


我还缺少其他更简单的技巧吗

不,恐怕不行-SQL Server 2000没有2005年的任何细节,如公共表表达式(CTE)等。。。。。谷歌链接中描述的方法似乎是一种方法

马克

也来看看这里


向下滚动到存储过程方法

根据您的应用程序体系结构(以及数据量、结构、数据库服务器负载等),您可以使用数据库访问层进行分页

例如,使用ADO,您可以在记录集(ADO.NET中的DataSet)对象上定义页面大小,并在客户端上进行分页。经典的ADO甚至允许您使用服务器端游标,尽管我不知道它是否能够很好地扩展(我认为这在ADO.NET中被完全删除)


MSDN文档:

在玩了一段时间后,似乎只有一种方法可以真正做到这一点(使用开始和长度参数),那就是使用临时表

我的最终解决方案是使用@start参数,而是使用@page参数,然后使用

    SET @sql = @sql + N'

    SELECT * FROM
    (
    SELECT TOP ' + Cast( @length as varchar) + N' * FROM 
            (
            SELECT TOP ' + Cast( @page*@length as varchar) + N'
                 field1,
                 field2 
                 From Table1
                 order by field1 ASC
            )  as Result   
            Order by Field1 DESC
     )  as Result
     Order by Field 1 ASC'

原始查询比这里显示的要复杂得多,order by至少在3个字段上排序,并由一个长CASE子句确定,这要求我使用一系列替换函数以正确的顺序获取字段。

多年来,我们一直在使用此查询的变体。本例给出了项目50000到50300

select top 300 
  Items.*
from Items
where 
  Items.CustomerId = 1234 AND
  Items.Active = 1 AND
  Items.Id not in
  ( 
    select top 50000 Items.Id
    from Items
    where 
      Items.CustomerId = 1234 AND
      Items.Active = 1
    order by Items.id
  )
order by Items.Id

中有两个与SQL Server 2000兼容的答案-跳过已接受的答案(仅限2005年):

您是否特别关注其中一个?其中一些似乎是访问特定的。我看到有一些计时,也许临时表不是一个坏办法。不确定它是否会使SP更具可读性。