来源:http://www.jb51.net/article/19936.htm
示例一
CREATE PROCEDURE commonPagination @columns varchar(500), --要显示的列名,用逗号隔开 @tableName varchar(100), --要查询的表名 @orderColumnName varchar(100), --排序的列名 @order varchar(50), --排序的方式,升序为asc,降序为 desc @where varchar(100), --where 条件,如果不带查询条件,请用 1=1 @pageIndex int, --当前页索引 @pageSize int, --页大小(每页显示的记录条数) @pageCount int --总页数,输出参数 as begin declare @sqlRecordCount nvarchar(1000) --得到总记录条数的语句 declare @sqlSelect nvarchar(1000) --查询语句 set @sqlRecordCount=N'select @recordCount=count(*) from ' +@tableName + ' where '+ @where declare @recordCount int --保存总记录条数的变量 exec sp_executesql @sqlRecordCount,N'@recordCount int output',@recordCount output --动态 sql 传参 if( @recordCount % @pageSize = 0) --如果总记录条数可以被页大小整除 set @pageCount = @recordCount / @pageSize --总页数就等于总记录条数除以页大小 else --如果总记录条数不能被页大小整除 set @pageCount = @recordCount / @pageSize + 1 --总页数就等于总记录条数除以页大小加1 set @sqlSelect = N'select '+@columns+' from ( select row_number() over (order by ' +@orderColumnName+' '+@order +') as tempid,* from ' +@tableName+' where '+ @where +') as tempTableName where tempid between ' +str((@pageIndex - 1)*@pageSize + 1 ) +' and '+str( @pageIndex * @pageSize) exec (@sqlSelect) --执行动态Sql end --以下是调用示例 declare @pageCount int exec commonPagination 'job_id,job_desc','jobs','job_id', 'asc','1=1',2,2,@pageCount output select '总页数为:' + str(@pageCount)
示例二
create PROCEDURE commonPagination (@TableName VARCHAR(2000), --表名 @ReFieldsStr VARCHAR(1000) = '*', --字段名(全部字段为*) @OrderString VARCHAR(200), --排序字段(必须!支持多字段不用加order by) @WhereString VARCHAR(500) = N'', --条件语句(不用加where) @PageSize INT, --每页多少条记录 @PageIndex INT = 1, --指定当前为第几页 @TotalRecord INT OUTPUT --返回总记录数 ) AS BEGIN --处理开始点和结束点 DECLARE @StartRecord INT; DECLARE @EndRecord INT; DECLARE @TotalCountSql NVARCHAR(500); DECLARE @SqlString NVARCHAR(2000); SET @StartRecord = (@PageIndex - 1) * @PageSize + 1; SET @EndRecord = @StartRecord + @PageSize - 1; SET @TotalCountSql = N'select @TotalRecord = count(*) from '+@TableName;--总记录数语句 SET @SqlString = N'(select row_number() over (order by '+@OrderString+') as rowId,'+@ReFieldsStr+' from '+@TableName;--查询语句 -- 判断条件是否为空 IF(@WhereString != '' OR @WhereString != NULL) BEGIN SET @TotalCountSql = @TotalCountSql+' where '+@WhereString; SET @SqlString = @SqlString+' where '+@WhereString; END; --返回总记录数 EXEC sp_executesql @totalCountSql, N'@TotalRecord int out', @TotalRecord OUTPUT; ----执行主语句 SET @SqlString = 'select * from '+@SqlString+') as t where rowId between '+LTRIM(STR(@StartRecord))+' and '+LTRIM(STR(@EndRecord)); EXEC (@SqlString); END;
关于between and 可使用 rowId >= StartRecord AND rowId <= EndRecord 代替,效率更高。
网上很多关于top分页的例子,不推荐使用top
相关文章