我被赋予了重构现有存储过程的任务,以便对结果进行分页。 SQL服务器是SQL 2000,所以我不能使用ROW_NUMBER分页方法。存储过程已经相当复杂,在执行sp_executesql之前一起构建一个大型sql语句的块,并且有各种可用的排序选项。
first result out of google似乎是一个很好的方法,但我认为这个例子是错误的,因为需要颠倒第二种类型,并且当开始时间小于页面长度时会出现故障。该页面上的第二个示例似乎也是一个很好的方法,但SP采用的是pageNumber,而不是起始记录。整个临时表似乎是性能消耗。
我正在沿着这条道路前进,但它似乎缓慢且令人困惑,我不得不在排序顺序上做相当多的REPLACE方法,以使其正确。
我还缺少其他更简单的技巧吗?
答案 0 :(得分:1)
this StackOverflow question中有两个符合SQL Server 2000的答案 - 跳过已接受的答案,仅限2005年:
答案 1 :(得分:0)
不,我不敢 - SQL Server 2000没有像Common Table Expression(CTE)这样的2005年的任何细节...... Google链接中描述的方法似乎是一种方法去。
马克
答案 2 :(得分:0)
答案 3 :(得分:0)
根据您的应用程序架构(以及您的数据量,结构,数据库服务器负载等),您可以使用数据库访问层进行分页。
例如,使用ADO,您可以在记录集(ADO.NET中的DataSet)对象上定义页面大小,并在客户端上执行分页。经典的ADO甚至可以让你使用服务器端游标,虽然我不知道它是否能很好地扩展(我认为这在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