使用Start和Length参数从SQL 2000中分页的好方法是什么?

时间:2009-01-15 17:12:16

标签: sql-server stored-procedures sql-server-2000 pagination

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

first result out of google似乎是一个很好的方法,但我认为这个例子是错误的,因为需要颠倒第二种类型,并且当开始时间小于页面长度时会出现故障。该页面上的第二个示例似乎也是一个很好的方法,但SP采用的是pageNumber,而不是起始记录。整个临时表似乎是性能消耗。

我正在沿着这条道路前进,但它似乎缓慢且令人困惑,我不得不在排序顺序上做相当多的REPLACE方法,以使其正确。

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

6 个答案:

答案 0 :(得分:1)

this StackOverflow question中有两个符合SQL Server 2000的答案 - 跳过已接受的答案,仅限2005年:

答案 1 :(得分:0)

不,我不敢 - SQL Server 2000没有像Common Table Expression(CTE)这样的2005年的任何细节...... Google链接中描述的方法似乎是一种方法去。

马克

答案 2 :(得分:0)

另请看这里 http://databases.aspfaq.com/database/how-do-i-page-through-a-recordset.html

向下滚动到存储过程方法

答案 3 :(得分:0)

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

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

MSDN文档:Paging Through a Query Result (ADO.NET)

答案 4 :(得分:0)

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

我的最终解决方案是使用@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子句确定,要求我使用一系列REPLACE函数来获取右边的字段顺序。

答案 5 :(得分:0)

我们多年来一直在使用此查询的变体。此示例提供50,000到50,300项。

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