日历

2008 7.7 Mon
  12345
6789101112
13141516171819
20212223242526
2728293031  
«» 2008 - 7 «»

文章搜索

日志文章

2008年05月15日 19:16:59

sql 的分页技术

1

TOP的替代



  有一个这样的TOP替代,它使用的是rowcount(行计数)。使用行计数要小心。如果它不关闭的话,将陷入各种各样的困境。
SET rowcount 10

SELECT * from Customers ORDER BY CompanyName

2

WITH, ROW_NUMBER (行数)and OVER



  这对SQL Server 2005来说非常新鲜并且看上去非常有用。下面一个例子显示从一个结果集得到2019条记录。刚开始有一点惊奇,但是浏览了查询器后发现它是如此简单。


With Cust AS

( SELECT CustomerID, CompanyName, ROW_NUMBER() OVER (order by CompanyName) as RowNumber FROM Customers )

select * from Cust Where RowNumber Between 20 and 30



ROW_NUMBER() OVER (order by CompanyName) 根据CompanyName 排序,然后在一个结果集中纪录该行是第几行!!!!

  SQL Server 2005WITH指定了一个临时命名的结果,很像SQL Server以前版本中的临时表。但是,输入部分是ROW_NUMBEROVER声明,它根据公司的名称在每组中创建行数。这就像通过命令条文向临时表添加一个身份种子。
3

一起整合到储存过程中



  现在我们把它一起整合到储存过程,这个储存过程我们可以通过应用程序来使用。暂时不展示.NET Datagrid或者相似的控件,因为是本文探讨范围之外。下面看到的储存过程使用了灵活的页面大小和页面数目,所以可以随意地选择任何页面。这样,如果想跳过前十页去寻找某一条记录就非常方便了。下面的例子是从第一页开始分页的,而不是从第0页,但也可以随意更改。


CREATE PROC GetOrderByPage
@PageSize int,
@PageNumber int
AS
Declare @RowStart int
Declare @RowEnd int
if @PageNumber > 0
Begin
SET @PageNumber = @PageNumber -1
SET @RowStart = @PageSize * @PageNumber + 1;
SET @RowEnd = @RowStart + @PageSize - 1 ;
With Order AS ( SELECT OrderNumber, ItemFamilyID, ROW_NUMBER() OVER (order by OrderNumber) as RowNumber FROM OrderHeader )
select * from Order Where RowNumber >= @RowStart and RowNumber <= @RowEnd end END




  运行这个程序,仅需指定页面大小和页数目(GetOrderByPage, @PageSize and @PageNumber),代码如下:


exec GetCustomersByPage 10, 1


Tags: top   数据库 分页  

类别: database |  评论(1) |  浏览(1006) |  收藏
1楼 [匿名]anya22 2008年07月04日 08:11:35 Says:
我把您的这篇文章转载到www.cnisv.com里了,欢迎有空去看看,谢谢
发表评论