参考了netkillerbaseSQL Server 存储过程的分页,开始决定采用效率最高的“方案二”,即通过ID标识来比较大小,从而快速检索出所需的记录。
为了方便读者,我在这里简单列出前面列出的参考文章中的3种分页查询存储过程的核心T-SQL语句:
方案一:
SELECTTOP 页大小 * FROM TestTable WHERE (ID NOTIN (SELECTTOP 页大小*页数 id FROM 表 ORDERBY id)) ORDERBY ID
方案二:
SELECTTOP 页大小 * FROM TestTable WHERE (ID > (SELECTMAX(id) FROM (SELECTTOP 页大小*页数 id FROM 表 ORDERBY id) AS T)) ORDERBY ID
方案三:(利用SQL的游标存储过程分页)
createprocedure XiaoZhengGe @sqlstrnvarchar(4000), --查询字符串 @currentpageint, --第N页 @pagesizeint--每页行数 as set nocount on declare@P1int, --P1是游标的id @rowcountint exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output selectceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 set@currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off
SELECTTOP 页大小 * FROM TestTable WHERE (ordercol >=SELECTMAX(ordercol) FROM (SELECTTOP 页大小*页数 ordercol FROM TestTable ORDERBY ordercol )) and (ID NOTIN (SELECTTOP 页大小*页数 id FROM TestTable ORDERBY ordercol)) ORDERBY ordercol
这种方式继承了“方案一”的缺点,即在记录数相当大,而且页码靠后时,(SELECT TOP 页大小*页数 id FROM TestTable ORDER BY ordercol)所得到的记录集会消耗相当大的内存。但是,于此同时,前面先进行的比较判断(ordercol >= SELECT MAX(ordercol) FROM (SELECT TOP 页大小*页数 ordercol FROM TestTable ORDER BY ordercol ))所得到的记录数量却并不大,加上比较查询的效率远远高于not in,所以最终的执行效率还是可以让人接受的。