2

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

谷歌的第一个结果似乎是一个好方法,但我认为这个例子是错误的,因为第二次排序需要反转,并且开始小于页面长度的情况会被打破。该页面上的第二个示例似乎也是一个好方法,但 SP 采用的是 pageNumber 而不是开始记录。整个临时表的事情似乎会消耗性能。

我正在沿着这条道路取得进展,但它似乎缓慢而令人困惑,我必须在排序顺序上执行相当多的 REPLACE 方法才能让它正确出现。

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

4

6 回答 6

1

此 StackOverflow 问题中有两个符合 SQL Server 2000 的答案- 跳过已接受的答案,它仅适用于 2005:

于 2009-01-19T21:41:50.100 回答
0

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

马克

于 2009-01-15T17:16:44.390 回答
0

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

向下滚动到存储过程方法

于 2009-01-15T17:19:08.083 回答
0

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

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

MSDN 文档:通过查询结果进行分页 (ADO.NET)

于 2009-01-15T18:31:55.050 回答
0

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

我的最终解决方案是使用 @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 函数来以正确的顺序获取字段。

于 2009-01-15T20:08:57.850 回答
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
于 2009-01-19T15:47:10.753 回答