SQL SERVER 2005 通用高效分页存储过程

  1. set ANSI_NULLS ON
  2. set QUOTED_IDENTIFIER ON
  3. GO
  4. -- =============================================
  5. -- Description:    <高效分页存储过程,仅适用于Sql2005>
  6. -- Notes:        <排序字段强烈建议建索引>
  7. -- =============================================
  8. ALTER Procedure [dbo].[up_Page2005] 
  9.  @TableName varchar(500),        --表名
  10.  @Fields varchar(8000) = '*',    --字段名(全部字段为*)
  11.  @OrderField varchar(8000),        --排序字段(必须!支持多字段)
  12.  @sqlWhere varchar(8000) = Null,--条件语句(不用加where)
  13.  @pageSize int,                    --每页多少条记录
  14.  @pageIndex int = 1 ,            --指定当前为第几页
  15.  @TotalPage int output            --返回总页数 
  16. as
  17. begin
  18.     Begin Tran --开始事务
  19.     Declare @sql nvarchar(4000);
  20.     Declare @totalRecord int;    
  21.     --计算总记录数
  22.          
  23.     if (@SqlWhere='' or @sqlWhere=NULL)
  24.         set @sql = 'select @totalRecord = count(*) from ' + @TableName
  25.     else
  26.         set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
  27.     EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数        
  28.     
  29.     --计算总页数
  30.     select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
  31.     if (@SqlWhere='' or @sqlWhere=NULL)
  32.         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
  33.     else
  34.         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere    
  35.         
  36.     
  37.     --处理页数超出范围情况
  38.     if @PageIndex<=0 
  39.         Set @pageIndex = 1
  40.     
  41.     if @pageIndex>@TotalPage
  42.         Set @pageIndex = @TotalPage
  43.      --处理开始点和结束点
  44.     Declare @StartRecord int
  45.     Declare @EndRecord int
  46.     
  47.     set @StartRecord = (@pageIndex-1)*@PageSize + 1
  48.     set @EndRecord = @StartRecord + @pageSize - 1
  49.     --继续合成sql语句
  50.     set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
  51.     --print @sql ;
  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
  64. end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值