SQL分页方法

表中主键必须为标识列,[ID] int IDENTITY (1,1)
也可以使用联合主键 id+id2+id3+……

 

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, @rowcount=@rowcount 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

 

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

 

----------------------------------------------------------------------------------

 

1、“俄罗斯存储过程”的改良版
CREATE procedure pagination1
(@pagesize int, --页面大小,如每页存储20条记录
@pageindex int --当前页码)
as
set nocount on
begin
declare @indextable table(id int identity(1,1),nid int) --定义表变量
declare @PageLowerBound int  --定义此页的底码
declare @PageUpperBound int  --定义此页的顶码
set @PageLowerBound = (@pageindex-1)*@pagesize
set @pageUpperBound = @PageLowerBound
+@pagesize
set rowcount @PageUpperBound
insert into @indextable(nid) select gid from TGongwen where fariqi>dataadd(day,-365,getdate()) order by fariqi desc

select O.gid, O.mid, O.title, O.fadanwei, O.fariqi from TGongwen O,
@indextable t where O.gid = t.nid
and t.id>@PageLowerBound and t.id<
=@PageUpperBound order by t.id

end
set nocount off

以上存储过程运用了SQL SERVER的最新技术--表变量。应该说这个存储过程也是一个非常优秀的颁存储过程。当然,在这个过程中,也可以把其中的表变量写成临时表:CREATE TABEL #Temp。但很明显,在SQL SERVER中,用临时表是没有用表变量快的。所以,感觉速度比原来的ADO的好。

 

2. not in 的方法:
从publish表中取出第n条到第m条的记录:SELECT TOP m=n+1 *
FROM publish
WHERE(id NOT IN
(SELECT TOP n-1 id FROM publish))


id为publish表的关键字

使用了not in 而not in 是无法使用索引的,效率上还是差了一点。

 

 


3. max的方法:
SELECT TOP 页大小 *
FROM TABLE 1
WHERE id>
(SELECT MAX(id) FROM
(SELECT TOP((页码-1)*页大小)id FROM TABLE 1 ORDER BY id) as T)

 

4. 定位法

DECLARE @PageSize int --返回一页的记录数
DECLARE @CurPage int --页号(第几页)0:第一页; -1:最后一页。

DECLARE @Count int
DECLARE @id int

SET @PageSize =10
SET @CurPage =1

--定位
IF @CurPage = -1
BEGIN --最后一页
SET ROWCOUNT @PageSize
SELECT @id = newsID FROM newsTemp ORDER BY newsID
end

IF @CurPage >0
BEGIN
SET @Count
=@PageSize*(@CurPage -1)+1
SET ROWCOUNT @Count
SELECT @id = newsID from newsTemp order by newsID DESC
end

--返回记录
SET ROWCOUNT @PageSize
SELECT * FROM newsTemp where newsID <= @id ORDERBY newsID DESC
SET ROWCOUNT 0

 

单字段排序,排序字段的值不能重复

 

5. 颠颠倒倒法
SELECT * FROM TABLE WHERE id IN
(SELECT TOP 10 id FROM
(SELECT TOP 20 id,addedDate FROM TABLE ORDER BY addedDate DESC)
AS aa ORDER BY addedDate)
ORDER BY addedDate DESC

 

 

ID 是主键,addedDate是排序字段
必须有主键

 

 

----------------------------------------------------------------------------------

 

SELECT top 页大小*
FROM TABLE 1
WHERE id >
(SELECT MAX(id) FROM
(SELCT TOP((页码-1)*页大小)id FROM TABLE 1 ORDER BY id)AS T)
ORDER BY id

--获取指定页的数据
CREATE PROCEDURE pagination3
@tblName varchar(255), --表名
@strGetFields varchar(1000)='*', --需要返回的列
@fldName varchar(255)='', --排序的字段名
@PageSize int =10, --页尺寸
@PageIndex int =1, --页码,
@doCount bit =0, --返回记录总数,非0值则返回
@OrderType bit =0, --设置排序类型,非0值则降序
@strWhere varchare(1500)='' --查询条件(注意:不要加where)
AS
DECLARE @strSQL varchar(5000) --主语句
DECLARE @strTemp varchar(110) --临时变量
DECLARE @strOrder varchar(400) --排序类型

IF @doCount!=0
BEGIN
 IF @strWhere!=''
 SET @strSQL='SELECT COUNT(*) AS Total FROM ["
+@tblname+"]WHERE "+@strWhere+"
 ELSE
 SET @strSQL ="SELECT COUNT(*) AS Total FROM ["
+@tblName+"]"
END
--如果@doCount传回来的不是0,就执行总数统计。以下所有代码 都是@doCount为0的情况
ELSE
BEGIN

IF @OrderType !=0
BEGIN
  SET @strTemp ="<(SELECT MIN"
  SET @strOrder ="ORDER BY["
+@fldname+"]DESC"
--如果@OrderType不是0,就执行降序,这句很重要!
END
ELSE
BEGIN
  SET @strTemp =">(SELECT MAX"
  SET @strOrder ="ORDER BY ["
+@fldName+"]ASC"
END

IF @PageIndex =1
BEGIN
  IF @strWhere !=''
  SET @strSQL = "SELECT TOP"+str(@PageSize)+""
+@strGetFields+"from["+@tblname+"]
WHERE "
+@strWhere+"+""+@strOrder
  ELSE
  SET @strSQL = "SELECT TOP"+STR(@PageSize)+""
+@strGetFields+FROM["+@tblname+"]"+@strOrder
--如果第一页就执行以上代码,这样会加快执行速度
END
ELSE
BEGIN
--以下赋予了@strSQL以真正执行的SQL代码
SET @strSQL ="SELECT TOP"+str(@PageSize)+""
+@strGetFields+"FROM["
+@tblName+"]WHERE["+@fldName+"]"+@strTemp+"(["+@fldname+"])FROM
(SELECT TOP "+str((@PageIndex-1)*@PageSize)+"["+@fldName+"]FROM["+@tblNmae+"]"+@strOrder+")AS tblTemp"+@strOrder

IF @strWhere !=''
  SET @strSQL = "SELECT TOP" +STR(@PageSize)+""
+@strGetFields+"FROM["
 
+@tblname+"]WHERE["+@fldName+"]"+@strTemp+"(["
 
+@fldName+"])FROM(SELECT TOP "+str((@PageIndex-1)*@PageSize)+"[
 
+@fldName+"]FROM["+@tblname+"[WHERE"+@strWhere+""
 
+@strOrder +")AS tblTemp)AND "+ @strWhere+""+@strOrder
END
END
EXEC(@strSQ
L)
GO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.本版本的需要2.0框架支持<br>2.功能:<br> 支持数据缓存<br> 支持分页方式多样化<br> 支持SQL数据库<br> 支持GridView数据表格<br><br> 请注意若您需要用到图片分页模式请拷贝Images文件夹.如果需要定义自己的图片样式,请不要改变图片的名称即可.<br><br>3.不足 <br> 控件暂时只支持SQL数据库其他数据库的支持接口以完成还没来得及写,有时间我会升级<br> 控件暂时不支持存储过程<br> 现在发布的也只是个BATE版有BUG欢迎指正<br> 邮箱:wensifww@163.com<br> QQ:24754991<br> QQ群:24604453<br><br> <br>4版本升级<br> (1) SqlPage 1.0.1.0 版本:(修改时间:2006-11-23)<br> 1.修正了在不使用缓存的情况下控检不显示数据的BUG<br> 2.去除HasGridView属性该为控件自行判断数据表格类型<br> 3.增加在用缓存模式下改变SQL语句获得新数据功能<br> 4.在绑定表格后对表格操作后绑定更加简单只需添加SqlPage1.DataBind()方法即可<br> 去除程序员写繁琐的绑定CODE<br> 5.添加了ControlToPaginate内置属性用于获得当前控件所绑定的数据表格控件<br> <br> (2)SqlPage 1.0.1.2 版本:(修改时间:2007-1-27)<br> 1.修正了表格控检在多层中SqlPage找不到绑定控件的BUG。 <br> 2.应很多朋友呼吁删除排序字段开发排序SQL语句,由程序员自己写<br><br> (3)SqlPage 1.1.4.8 版本:(修改时间:2007-7-31)<br> 1.优化数据读取(支持百万级数据读取)<br> 2.分页控件资源集成化,不需要用户Copy控件资源文件<br> 3.分页控件排序优化:默认情况下为表主键排序<br> 4.修正分页控件在删除当前索引也中所有行不能自动转到上一页的错误<br> 5.添加分页的排序方式<br> 6.自定义排序的字段<br> 7.修正在除GridView外表格控件绑定空数据库时出错问题<br> 8.修正用户SQL语句后面带分号出错<br> 9.修正降序排序单页显示成升序的错误<br> (4)SqlPage 1.2.2.3 版本:(修改时间:2007-8-9)<br> 1.修正MSSQL用户SQL语句中同时带有TOP 和ORDER BY 语句程序不能识别问题<br> 2.添加了以分页段的分页样式丰富了分页样式<br> 3.做了一个控制分页控件样式表(CSS)的DOME(有朋友不知道怎么去控制这里简单的 说明使用方法,很简单)<br> 4.修正MSSQL用户SQL语句中ORDER BY再次绑定的问题 <br> 5.修正控件分页模式在图片分页模式下控件编辑状态出错问题<br> 6.新添了控件自动添加前缀功能(Wensi)<br> 7.新增分页跳转类型,两种:下拉列表框和文本框,系统默认为下拉列表框,(在实际开发中我们发现下拉列表框在分页数达到1000级以上的时候明显变慢,所以建议大家在分页数很大时使用文本框类型这样可以明显提高效率)<br> 8.新增控件样式CSS文件是否用系统自带的样式文件还是用户自定义样式文件属性 HasSystemPageStyle<br> (5)SqlPage 1.2.5.3 版本:(修改时间:2007-10-24)<br> 1.修改了在2次绑定无数据时现实前一次绑定数据的BUG<br> 2.修改了在页面索引为-1时系统不能正常恢复显示数据BUG<br>如果您在使用中发现BUG或有很好的建议请联系我,让大家一起参与进来维护好这个控件.<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值