代码改变世界

分页存储过程

2009-02-09 11:31  daixueji  阅读(367)  评论(1编辑  收藏  举报

创建时间

2009-2-8

作者

主题

分页存储过程

描述

存储过程分页有多种形式,其中sql server 2000 sql server 2005的特征也可以决定存储过程的形式

内容

l        SQL SERVER 2000:临时表创建存储过程

1 CREATE PROCEDURE dbo.CreateSimple
 2 (
 3  @PageIndex int,
 4  @PageSize int
 5 )
 6 AS
 7 BEGIN
 8  --定义三个变量:
 9
 -- @PageLowerBound :所取出记录的下限.
10
 -- @PageUpperBound: 所要取出记录的上限.
11
 -- @TotalRecords: 返回记录总数,主要用于页面的计算.
12
 DECLARE @PageLowerBound int
13  DECLARE @PageUpperBound int
14  DECLARE @TotalRecords int
15
16  --计算上下限的值.
17
 SET @PageLowerBound=@PageIndex * @PageSize
18  SET @PageUpperBound=@PageLowerBound+@PageSize-1
19
20 --创建临时表:
21 --IndexId
是标识,自动增长1;
22 --SimpleId
由数据表[Simple]填充;
23
 CREATE TABLE #PageIndexForSimple
24  (
25   IndexId int identity(1,1NOT NULL,
26   SimpleId int
27  )
28 --填充临时表
29
  INSERT INTO #PageIndexForSimple(SimpleId)
30   SELECT s.[SimpleId]
31   FROM [Simple] s
32   --这里可以加WHERE conditionODER BY语句
33
  
34   --取得记录总数,其实影响行数就是记录总数
35
  SELECT @TotalRecords=@@ROWCOUNT
36
37   --获取我们所要的记录.
38
  SELECT s.*
39   FROM [Simple] s,#PageIndexForSimple p
40   WHERE s.[SimpleId]=p.[SimpleId]
41             AND p.[IndexId]>=@PageLowerBound
42             AND P.[IndexId]<=@PageUpperBound
43   ORDER BY s.[Simple]
44  
45    --返回记录总数.
46
   RETURE @TotalRecords
47 END 

 

l        SQL SERVER 2005:利用ROW_NUMBER() 具体用法可以参考开窗函数,排序函数

CREATE PROCEDURE changeArticlePage

(

@pageSize int,

@pageIndex int

)

AS

BEGIN

declare @startRow int,@endRow int

set @startRow=(@pageIndex-1)*@pageSize+1

set @endRow=@pageIndex*@pageSize

select * from (

    SELECT *, Row_Number() over(order by Id desc) as row

    from Articles) as tb_page

    where

    row between @startRow and @endRow

END

GO

总结

1.      临时表中有自动标志列;把标志列和要分页的表的记录的关键字一一对应;构成了临时表的基础架构;用分页表标志列填充临时表中对应字段;表之间连接,把临时表ID嫁接过来,得到理想的分页架构;

2.      SQL SERVERE 2005 中特有函数ROW_NUMBER()OVER()绑定使用,生成分页架构

3.      上述分页思想有一个共性:分页架构都添加了排序字段,数值是连续整型;为分页提供了充分的条件