CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

請教一SQL,關於分頁查詢的問題

楼主novice2004(千年菜鳥)2004-05-04 11:58:59 在 MS-SQL Server / 疑难问题 提问

因為數據量特大,所以想求一存儲過程  
  輸入參數:頁碼  
  輸出:本頁數據  
  說明:每次只讀取一頁數據  
   
  請各位高手賜教.同時如果各位有解決大數據量的方法也可賜教,謝謝!! 问题点数:100、回复次数:17Top

1 楼txlicenhe(马可)回复于 2004-05-04 12:03:09 得分 20

http://expert.csdn.net/Expert/topic/2365/2365596.xml?temp=.5068781  
  Top

2 楼zheninchangjiang(徐若涵)回复于 2004-05-04 12:04:02 得分 20

http://expert.csdn.net/Expert/topic/2942/2942208.xml?temp=.0131647Top

3 楼novice2004(千年菜鳥)回复于 2004-05-04 13:39:49 得分 0

還有其他方法嗎?或者說有沒其他建議什麼的  
  Top

4 楼txlicenhe(马可)回复于 2004-05-04 14:13:44 得分 0

私下见过一个高手写的分页处理,真的太好了,暂时不知在哪里发表了没有。Top

5 楼progress99(如履薄冰)回复于 2004-05-04 14:26:22 得分 10

如果數據量特大,建議新增一id列,建上索引,通過id分頁Top

6 楼realgz(realgz)回复于 2004-05-04 14:28:33 得分 20

txlicenhe(马可)   :发表了啊,二楼就是Top

7 楼txlicenhe(马可)回复于 2004-05-04 14:35:45 得分 0

哦,感谢楼上。  
  Top

8 楼zjcxc(邹建)回复于 2004-05-04 14:40:08 得分 20

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_show]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[p_show]  
  GO  
   
  /*--实现分页的通用存储过程  
   
  显示指定表、视图、查询结果的第X页  
  对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法  
  如果视图或查询结果中有主键,不推荐此方法  
  如果使用查询语句,而且查询语句使用了order   by,则查询语句必须包含top   语句  
   
  --邹建   2003.09--*/  
   
  /*--调用示例  
  exec   p_show   '地区资料'  
   
  exec   p_show   'select   top   100   percent   *   from   地区资料   order   by   地区名称',5,3,'地区编号,地区名称,助记码'  
  --*/  
  CREATE   Proc   p_show  
  @QueryStr   nvarchar(4000), --表名、视图名、查询语句  
  @PageSize   int=10, --每页的大小(行数)  
  @PageCurrent   int=1, --要显示的页  
  @FdShow   nvarchar   (4000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段  
  @FdOrder   nvarchar   (1000)='' --排序字段列表  
  as  
  declare   @FdName   nvarchar(250) --表中的主键或表、临时表中的标识列名  
  ,@Id1   varchar(20),@Id2   varchar(20) --开始和结束的记录号  
  ,@Obj_ID   int --对象ID  
  --表中有复合主键的处理  
  declare   @strfd   nvarchar(2000) --复合主键列表  
  ,@strjoin   nvarchar(4000) --连接字段  
  ,@strwhere   nvarchar(2000) --查询条件  
   
   
  select   @Obj_ID=object_id(@QueryStr)  
  ,@FdShow=case   isnull(@FdShow,'')   when   ''   then   '   *'   else   '   '+@FdShow   end  
  ,@FdOrder=case   isnull(@FdOrder,'')   when   ''   then   ''   else   '   order   by   '+@FdOrder   end  
  ,@QueryStr=case   when   @Obj_ID   is   not   null   then   '   '+@QueryStr   else   '   ('+@QueryStr+')   a'   end  
   
  --如果显示第一页,可以直接用top来完成  
  if   @PageCurrent=1  
  begin  
  select   @Id1=cast(@PageSize   as   varchar(20))  
  exec('select   top   '+@Id1+@FdShow+'   from   '+@QueryStr+@FdOrder)  
  return  
  end  
   
  --如果是表,则检查表中是否有标识更或主键  
  if   @Obj_ID   is   not   null   and   objectproperty(@Obj_ID,'IsTable')=1  
  begin  
  select   @Id1=cast(@PageSize   as   varchar(20))  
  ,@Id2=cast((@PageCurrent-1)*@PageSize   as   varchar(20))  
   
  select   @FdName=name   from   syscolumns   where   id=@Obj_ID   and   status=0x80  
  if   @@rowcount=0 --如果表中无标识列,则检查表中是否有主键  
  begin  
  if   not   exists(select   1   from   sysobjects   where   parent_obj=@Obj_ID   and   xtype='PK')  
  goto   lbusetemp --如果表中无主键,则用临时表处理  
   
  select   @FdName=name   from   syscolumns   where   id=@Obj_ID   and   colid   in(  
  select   colid   from   sysindexkeys   where   @Obj_ID=id   and   indid   in(  
  select   indid   from   sysindexes   where   @Obj_ID=id   and   name   in(  
  select   name   from   sysobjects   where   xtype='PK'   and   parent_obj=@Obj_ID  
  )))  
  if   @@rowcount>1 --检查表中的主键是否为复合主键  
  begin  
  select   @strfd='',@strjoin='',@strwhere=''  
  select   @strfd=@strfd+',['+name+']'  
  ,@strjoin=@strjoin+'   and   a.['+name+']=b.['+name+']'  
  ,@strwhere=@strwhere+'   and   b.['+name+']   is   null'  
  from   syscolumns   where   id=@Obj_ID   and   colid   in(  
  select   colid   from   sysindexkeys   where   @Obj_ID=id   and   indid   in(  
  select   indid   from   sysindexes   where   @Obj_ID=id   and   name   in(  
  select   name   from   sysobjects   where   xtype='PK'   and   parent_obj=@Obj_ID  
  )))  
  select   @strfd=substring(@strfd,2,2000)  
  ,@strjoin=substring(@strjoin,5,4000)  
  ,@strwhere=substring(@strwhere,5,4000)  
  goto   lbusepk  
  end  
  end  
  end  
  else  
  goto   lbusetemp  
   
  /*--使用标识列或主键为单一字段的处理方法--*/  
  lbuseidentity:  
  exec('select   top   '+@Id1+@FdShow+'   from   '+@QueryStr  
  +'   where   '+@FdName+'   not   in(select   top   '  
  +@Id2+'   '+@FdName+'   from   '+@QueryStr+@FdOrder  
  +')'+@FdOrder  
  )  
  return  
   
  /*--表中有复合主键的处理方法--*/  
  lbusepk:  
  exec('select   '+@FdShow+'   from(select   top   '+@Id1+'   a.*   from  
  (select   top   100   percent   *   from   '+@QueryStr+@FdOrder+')   a  
  left   join   (select   top   '+@Id2+'   '+@strfd+'    
  from   '+@QueryStr+@FdOrder+')   b   on   '+@strjoin+'  
  where   '+@strwhere+')   a'  
  )  
  return  
   
  /*--用临时表处理的方法--*/  
  lbusetemp:  
  select   @FdName='[ID_'+cast(newid()   as   varchar(40))+']'  
  ,@Id1=cast(@PageSize*(@PageCurrent-1)   as   varchar(20))  
  ,@Id2=cast(@PageSize*@PageCurrent-1   as   varchar(20))  
   
  exec('select   '+@FdName+'=identity(int,0,1),'+@FdShow+'  
  into   #tb   from'+@QueryStr+@FdOrder+'  
  select   '+@FdShow+'   from   #tb   where   '+@FdName+'   between   '  
  +@Id1+'   and   '+@Id2  
  )  
   
  GO  
  Top

9 楼zjcxc(邹建)回复于 2004-05-04 14:40:30 得分 0

/*--分页方法:  
   
  回复人:   j9988(j9988)    
  --*/  
   
   
  declare   @sqlstr   nvarchar(4000),   --查询字符串  
  @pagecount   int, --第N页  
  @pagesize   int --每页行数  
   
  select   @pagecount=3,@pagesize=10  
  ,@sqlstr='select   *   from   sysobjects'  
   
  set   nocount   on  
  declare   @P1   int, --P1是游标的id  
  @rowcount   int  
   
  exec   sp_cursoropen   @P1   output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount   output  
  select   @rowcount   as   总行数,ceiling(1.0*@rowcount/@pagesize)   as   页数,@pagecount   as   当前页  
  set   @pagecount=(@pagecount-1)*@pagesize+1  
  exec   sp_cursorfetch   @P1,16,@pagecount,@pagesize    
  exec   sp_cursorclose   @P1  
  Top

10 楼zjcxc(邹建)回复于 2004-05-04 14:40:36 得分 0

'ASP中的分页例子,以SQL数据库为例,ACCESS数据库只需要更改连接字符串  
  <%  
  iConc   =   "Provider=SQLOLEDB.1;Persist   Security   Info=True;User   ID=用户名;Password=密码;Initial   Catalog=数据库名;Data   Source=SQL服务器名"  
  Set   iRe   =Server.CreateObject("ADODB.Recordset")  
  With   iRe  
                  .CursorLocation   =   3 'adUseClient  
                  .Open   "表名",   iConc,   1,1  
                  .PageSize   =   10                 '每页的大小  
                  iCount   =   .PageCount       '总页数  
                  .AbsolutePage   =   2           '设置当前显示第几页,这里是第2页  
                  For   iJ   =   1   To   .PageSize     '循环显示当前页的记录  
                                  '这里改为显示处理的代码  
                                  .MoveNext  
                                  If   .EOF   Then   Exit   For  
                  Next  
          End   With  
           
          iRe.Close  
          Set   iRe   =   Nothing  
  %>  
  Top

11 楼zjbee(赵杰)回复于 2004-05-04 15:36:45 得分 5

学习Top

12 楼novice2004(千年菜鳥)回复于 2004-05-04 15:46:25 得分 0

太謝謝個位了,請繼續指教,本貼今晚揭帖.  
  其他高手一定不要讓分數都被zjcxc(邹建),   txlicenhe(马可)   ,   progress99(如履薄冰)等列強瓜分了呀Top

13 楼novice2004(千年菜鳥)回复于 2004-05-04 16:34:36 得分 0

請問,使用存儲過程和程序分頁哪種效果最好?Top

14 楼txlicenhe(马可)回复于 2004-05-04 16:45:01 得分 0

看情况吧,个人认为:  
   
  如果要求第一次装载速度快,用存储过程分页较好  
  如果要求翻页速度快,用前台程序分页较好。Top

15 楼zjcxc(邹建)回复于 2004-05-04 16:46:24 得分 0

分页的效率与表结构有关系.建议你自己测试一下几种分页方法.  
  从中选取最适宜于你自己的一种.Top

16 楼novice2004(千年菜鳥)回复于 2004-05-04 20:55:48 得分 0

總以為幾十萬筆,如果一次讀出,那也太.....Top

17 楼pan5(斌)回复于 2004-05-05 17:49:28 得分 5

当然是存储过程分页最好呀!Top

相关问题

  • SQL查询语句求教(200分!)
  • SQL查询 问题 请教 ---100分
  • 请教SQL查询
  • 请教SQL查询
  • 请教SQL查询
  • 小弟初学SQL,求一SQL查询,请各位赐教,分不够再加
  • 请教SQL查询问题
  • 求教sql查询问题
  • 请教:关于SQL查询
  • 请教:关于SQL查询

关键词

  • .net
  • 语句
  • 查询
  • 字段
  • 视图
  • 數據
  • 分页
  • 表
  • 标识
  • 方法

得分解答快速导航

  • 帖主:novice2004
  • txlicenhe
  • zheninchangjiang
  • progress99
  • realgz
  • zjcxc
  • zjbee
  • pan5

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo