来源:http://dev.csdn.net/article/37/37213.shtm
建立表
1建立表:
2
3CREATE TABLE [TestTable] (
4 [ID] [int] IDENTITY (1, 1) NOT NULL ,
5 [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
6 [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
7 [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
8 [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
9) ON [PRIMARY]
10GO
11
12
分页方案一:(利用Not In和SELECT TOP分页)
语句形式:
方案一
1SELECT TOP 10 *
2FROM TestTable
3WHERE (ID NOT IN
4 (SELECT TOP 20 id
5 FROM TestTable
6 ORDER BY id))
7ORDER BY ID
8
9
10SELECT TOP 页大小 *
11FROM TestTable
12WHERE (ID NOT IN
13 (SELECT TOP 页大小*页数 id
14 FROM 表
15 ORDER BY id))
16ORDER BY ID
17
分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:
方案二
1SELECT TOP 10 *
2FROM TestTable
3WHERE (ID >
4 (SELECT MAX(id)
5 FROM (SELECT TOP 20 id
6 FROM TestTable
7 ORDER BY id) AS T))
8ORDER BY ID
9
10
11SELECT TOP 页大小 *
12FROM TestTable
13WHERE (ID >
14 (SELECT MAX(id)
15 FROM (SELECT TOP 页大小*页数 id
16 FROM 表
17 ORDER BY id) AS T))
18ORDER BY ID
19
分页方案三:(利用SQL的游标存储过程分页)
方案三
1create procedure XiaoZhengGe
2@sqlstr nvarchar(4000), --查询字符串
3@currentpage int, --第N页
4@pagesize int --每页行数
5as
6set nocount on
7declare @P1 int, --P1是游标的id
8 @rowcount int
9exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
10select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
11set @currentpage=(@currentpage-1)*@pagesize+1
12exec sp_cursorfetch @P1,16,@currentpage,@pagesize
13exec sp_cursorclose @P1
14set nocount off
其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用
更多的讨论见:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515