SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEproc[dbo].[up_Page2005]@TableNamevarchar(50), --表名@Fieldsvarchar(5000) ='*', --字段名(全部字段为*)@OrderFieldvarchar(5000), --排序字段(必须!支持多字段)@sqlWherevarchar(5000) =Null,--条件语句(不用加where)@pageSizeint, --每页多少条记录@pageIndexint=1 , --指定当前为第几页@TotalPageint output --返回总页数 asbeginBeginTran--开始事务Declare@sqlnvarchar(4000); Declare@totalRecordint; --计算总记录数if (@SqlWhere=''or@sqlWhere=NULL) set@sql='select @totalRecord = count(*) from '+@TableNameelseset@sql='select @totalRecord = count(*) from '+@TableName+' with(nolock) where '+@sqlWhereEXEC 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 '+@TableNameelseset@sql='Select * FROM (select ROW_NUMBER() Over(order by '+@OrderField+') as rowId,'+@Fields+' from '+@TableName+' with(nolock) where '+@SqlWhere--处理页数超出范围情况if@PageIndex<=0Set@pageIndex=1if@pageIndex>@TotalPageSet@pageIndex=@TotalPage--处理开始点和结束点Declare@StartRecordintDeclare@EndRecordintset@StartRecord= (@pageIndex-1)*@PageSize+1set@EndRecord=@StartRecord+@pageSize-1--继续合成sql语句set@Sql=@Sql+') as t where rowId between '+Convert(varchar(50),@StartRecord) +' and '+Convert(varchar(50),@EndRecord) print@sqlExec(@Sql) ---------------------------------------------------If@@Error<>0BeginRollBackTranReturn-1EndElseBeginCommitTranReturn@totalRecord---返回记录总数Endend
SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO --名称:分页存储过程 --使用示例 EXEC sp_PageIndex '*',' FROM StuSources ',2,10 --注意 --目前还没有对输入的参数进行严格的验证 --默认为输入都是合法有效的 ALTERPROC sp_PageIndex @sqlSelectvarchar(800) --SELECT 后面 FROM 前面 的 字段 不用包含SELECT ,@sqlFromvarchar(800) --FROM 后面 的 字段 包含FROM ,@countPerPageint-- 每页数据行数 ,@toPageint--要转到的页码 AS