天天看点

SQL分页法

表中主键必须为标识列,[ID] int IDENTITY (1,1)

1.分页方案一:(利用Not In和SELECT TOP分页)

语句形式:

SELECT TOP 10 *

FROM TestTable

WHERE (ID NOT IN

          (SELECT TOP 20 id

         FROM TestTable

         ORDER BY id))

ORDER BY ID

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID NOT IN

          (SELECT TOP 页大小*页数 id

         FROM 表

         ORDER BY id))

ORDER BY ID

2.分页方案二:(利用ID大于多少和SELECT TOP分页,效率最高)

语句形式: 

SELECT TOP 10 *

FROM TestTable

WHERE (ID >

          (SELECT MAX(id)

         FROM (SELECT TOP 20 id

                 FROM TestTable

                 ORDER BY id) AS T))

ORDER BY ID

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID >

          (SELECT MAX(id)

         FROM (SELECT TOP 页大小*页数 id

                 FROM 表

                 ORDER BY id) AS T))

ORDER BY ID

3.分页方案三:(利用SQL的游标存储过程分页)

create  procedure SqlPager

@sqlstr nvarchar(4000), --查询字符串

@currentpage int, --第N页

@pagesize int --每页行数

as

set nocount on

declare @P1 int, --P1是游标的id

 @rowcount int

exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @[email protected] output

select ceiling(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

4,用ROW_NUMBER()

SELECT *

FROM

(

SELECT ROW_NUMBER() OVER (ORDER BY ID) AS rowIndex

, *

FROM TestTable

)AS a

WHERE rowIndex>=页开始 and rowIndex<=页结束

WITH NoPagedDataSet AS

(

SELECT ROW_NUMBER() OVER (ORDER BY ID) AS rowIndex

,*

FROM TestTable

)

SELECT * from NoPagedDataSet

WHERE rowIndex>=页开始 and rowIndex<=页结束