SQL Server 2005 高性能分页

 1LTER Procedure [dbo].[up_Page2005] 
 2 @TableName varchar(50),        --表名
 3 @Fields varchar(5000= '*',    --字段名(全部字段为*)
 4 @OrderField varchar(5000),        --排序字段(必须!支持多字段)
 5 @sqlWhere varchar(5000= Null,--条件语句(不用加where)
 6 @pageSize int,                    --每页多少条记录
 7 @pageIndex int = 1 ,            --指定当前为第几页
 8 @TotalPage int output            --返回总页数 
 9as
10begin
11
12    Begin Tran --开始事务
13
14    Declare @sql nvarchar(4000);
15    Declare @totalRecord int;    
16
17    --计算总记录数
18         
19    if (@SqlWhere='' or @sqlWhere=NULL)
20        set @sql = 'select @totalRecord = count(*) from ' + @TableName
21    else
22        set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
23
24    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数        
25    
26    --计算总页数
27    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
28
29    if (@SqlWhere='' or @sqlWhere=NULL)
30        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
31    else
32        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere    
33        
34    
35    --处理页数超出范围情况
36    if @PageIndex<=0 
37        Set @pageIndex = 1
38    
39    if @pageIndex>@TotalPage
40        Set @pageIndex = @TotalPage
41
42     --处理开始点和结束点
43    Declare @StartRecord int
44    Declare @EndRecord int
45    
46    set @StartRecord = (@pageIndex-1)*@PageSize + 1
47    set @EndRecord = @StartRecord + @pageSize - 1
48
49    --继续合成sql语句
50    set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord+ ' and ' +  Convert(varchar(50),@EndRecord)
51    
52    Exec(@Sql)
53    ---------------------------------------------------
54    If @@Error <> 0
55      Begin
56        RollBack Tran
57        Return -1
58      End
59     Else
60      Begin
61        Commit Tran
62        Return @totalRecord ---返回记录总数
63      End    
64end
posted @ 2007-04-29 16:15  海底的鱼  阅读(413)  评论(1)    收藏  举报