SQLServer分页查询
今天心血来潮,想去了解一下SQLServer分页的写法(毕竟很久没用它了),然后到网上去查了有关这方面的相关知识。功夫不负有心人,最终在CSDN上看到了一篇讲述关于SQLServer分页查询的文章,感觉还不错,然后就寻思着把它给记下来,以便以后用的时候做参考。下面就是一个通用的分页查询存储过程。
1 /***---------------------------------------------- 2 *procedure name : prcPageResult 3 * author : FuChun 4 * create date : 2006-10-04 5 */ 6 CREATE PROCEDURE prcPageResult 7 -- 获得某一页的数据 -- 8 @currPage int = 1, --当前页页码 (即Top currPage) 9 @showColumn varchar(2000) = '*', --需要得到的字段 (即 column1,column2,......) 10 @tabName varchar(2000), --需要查看的表名 (即 from table_name) 11 @strCondition varchar(2000) = '', --查询条件 (即 where condition......) 不用加where关键字 12 @ascColumn varchar(100) = '', --排序的字段名 (即 order by column asc/desc) 13 @bitOrderType bit = 0, --排序的类型 (0为升序,1为降序) 14 @pkColumn varchar(50) = '', --主键名称 15 @pageSize int = 20 --分页大小 16 17 AS 18 BEGIN -- 存储过程开始 19 -- 该存储过程需要用到的几个变量 -- 20 DECLARE @strTemp varchar(1000) 21 DECLARE @strSql varchar(4000) --该存储过程最后执行的语句 22 DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc) 23 24 BEGIN 25 IF @bitOrderType = 1 -- bitOrderType=1即执行降序 26 BEGIN 27 SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC' 28 SET @strTemp = '<(SELECT min' 29 END 30 ELSE 31 BEGIN 32 SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC' 33 SET @strTemp = '>(SELECT max' 34 END 35 36 IF @currPage = 1 -- 如果是第一页 37 BEGIN 38 IF @strCondition != '' 39 SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+ 40 ' WHERE '+@strCondition+@strOrderType 41 ELSE 42 SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+@strOrderType 43 END 44 45 ELSE -- 其他页 46 BEGIN 47 IF @strCondition !='' 48 SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+ 49 ' WHERE '+@strCondition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+ 50 ' '+@pkColumn+' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType 51 ELSE 52 SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+ 53 ' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+@pkColumn+ 54 ' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType 55 END 56 57 END 58 EXEC (@strSql) 59 END -- 存储过程结束 60 ------------------------------------------------ 61 GO
该存储过程功能比较强大,尤其是在处理大数据时,效果很明显。