SQL 2005 分页存储过程

本文介绍了一种适用于SQL Server 2005及更高版本的高效分页存储过程。该过程支持通过指定表名、字段名、排序字段等参数进行灵活配置,并能够计算总页数和返回指定页的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- =============================================
-- Description:   <高效分页存储过程,适用于Sql2005以上>
-- Notes:      <排序字段强烈建议建索引>
-- Page2005'dyj_vclient','client_id,last_dt','client_id','last_dt','desc','',20,1,0
-- =============================================
CREATE Procedure [dbo].[sp_page] 
 @TableName varchar(2000),         --表名
 @Fields varchar(2000) = '*',    --字段名(全部字段为*)
 @PrimaryKey varchar(50),        --主键
 @OrderField varchar(500),      --排序字段(必须!支持多字段)
 @sqlWhere varchar(500) = Null,  --条件语句(不用加where)
 @pageSize int,                --每页多少条记录
 @pageIndex int = 1 ,           --指定当前为第几页
 @TotalPage int output          --返回总页数 
as
begin
 
    Begin Tran --开始事务
 
    Declare @sqlnvarchar(4000);
    Declare @totalRecordint;    
    ifisnull(@PrimaryKey,'')=''
      set @PrimaryKey='*'
    --计算总记录数
        
    if (@SqlWhere='' or@sqlWhere=NULL)
       set @sql = 'select @totalRecord = count('+@PrimaryKey +') from ' + @TableName
    else
       set @sql = 'select @totalRecord = count('+@PrimaryKey +') from ' + @TableName + ' where ' + @sqlWhere
 
    EXEC sp_executesql@sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数      
    
    --计算总页数
    select@TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
 
    if (@SqlWhere='' or@sqlWhere=NULL)
       set @sql = 'Select * FROM (select ROW_NUMBER()Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from '+ @TableName 
    else
       set @sql = 'Select * FROM (select ROW_NUMBER()Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from '+ @TableName + ' where ' + @SqlWhere   
       
    
    --处理页数超出范围情况
    if@PageIndex<=0 
       Set @pageIndex = 1
    
    if@pageIndex>@TotalPage
       Set @pageIndex = @TotalPage
 
    --处理开始点和结束点
    Declare @StartRecordint
    Declare @EndRecordint
    
    set @StartRecord =(@pageIndex-1)*@PageSize + 1
    set @EndRecord =@StartRecord + @pageSize - 1
 
    --继续合成sql语句
    set @Sql = @Sql + ') as[page_result_table] where rowId between ' +Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)
    
    Exec(@Sql)
   ---------------------------------------------------
    If @@Error<> 0
     Begin
       RollBack Tran
       Return -1
     End
    Else
     Begin
       Commit Tran
       Return @totalRecord ---返回记录总数
      End   
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值