CREATE PROCEDURE pageTest  --用于翻页的测试
--需要把排序字段放在第一列 (
  @FirstID nvarchar(20)=null,  --当前页面里的第一条记录的排序字段的值
  @LastID nvarchar(20)=null,  --当前页面里的最后一条记录的排序字段的值
  @isNext bit=null,    --true 1 :下一页;false 0:上一页
  @allCount int output,   --返回总记录数
  @pageSize int output,   --返回一页的记录数
  @CurPage int     --页号(第几页)0:第一页;-1最后一页。
  )ASif @CurPage=0
 begin
  --统计总记录数
  select @allCount=count(ProductId) from Product_test 
   
  set @pageSize=10
  --返回第一页的数据
  select top 10 
   ProductId,
   ProductName,
   Introduction   
   from Product_test order by ProductId 
 endelse if @CurPage=-1 select * from 
  (select top 10 ProductId,
   ProductName,
   Introduction  from Product_test order by ProductId desc ) as aa  
  order by ProductId
else begin 
  if @isNext=1
   --翻到下一页
   select top 10 ProductId,
   ProductName,
   Introduction
  from Product_test where ProductId > @LastID order by ProductId 
   
   
  else
   --翻到上一页
   select * from
    (select top 10 ProductId,
   ProductName,
   Introduction
  from Product_test where ProductId < @FirstID  order by ProductId desc) as bb order by ProductId
 end
 百万数据翻页就像100条数据一样!http://www.jyklzz.net/web/jyk/index.asp 这里有详细的说明

解决方案 »

  1.   

    本来就是吗?
    自定义翻面的意思就是:每次取得数据都是你根据页码来取到的!
    dataGrid自带的数据分面就是将要的结果集全部查出来,然后再系统的分面,效率当然慢很多了!
    我也一般是用自定义分页,不过存储过程没必要你那么复杂!
    参数只要:
    1。页面最大行
    2。当前页码
    3。查询结果集所要用到的参数(可以是存储过程,或临时表,或 查询串之类的)其它的下一页,等等都是通过前台处理再传进的页码而已
      

  2.   

    对于一个大网站来说,内存是很宝贵的资源,DataGrid本身就是很占用资源的,它自带的分页就更占内存了。
    如果数据量很大,或则访问的人数很多,内存很容易就会被SQL Server占满了,导致网站的访问速度大大减慢。这个存储过程并不复杂,只是为了效率写的有点烦琐。
      

  3.   

    回复人: studyzy(深蓝) ( ) 信誉:100  2004-11-26 21:33:00  得分: 0  
     
     
       真有这么好吗?看不出来
      
     当然了,不信你可以试一下。
      

  4.   

    这个只能是SQL的。
    如果ORACLE的呢?
      

  5.   

    look ~  支持下:)
      

  6.   

    这个只能是SQL的。
    如果ORACLE的呢?换成 ORACLE的语法吗。
    思路应该是一样的。
    另外说明一点:对于10万以上的数据,排序字段最好是主键,也就是给排序字段作索引,否则的话会受到一定的影响。http://218.24.108.91:9006/newsManage/test4.aspx
    这是一个829920 条数据的事例。由于是在我的电脑上,所以在我关机前都是可以看到的,如果看不到就说明我已经关机了:)另外发现了一个问题:select count(*) from table 在执行的时候很占用内存 
    50万条数据就要占用70多M的内存,但是呢82万条数据也是占用差不多相同的内存。不太清楚,sql统计记录数,为什么会占用这么大的内存???
      

  7.   

    http://community.csdn.net/Expert/topic/3587/3587201.xml?temp=1.829165E-02
      

  8.   

    就是看了这个帖子,我想起来才发的。我已经在http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=5&Id=101022 发过了。http://community.csdn.net/Expert/topic/3587/3587201.xml?temp=1.829165E-02
    这里讲的方法,和我的思路是一样的,由于我还没找到一个高效的指定页号翻页的方法,所以呢我的存储过程里面就没有这个功能。他的指定页用了not in 方法,这对于海量数据是无法容忍的一定会把服务器托死的,当然了对于一般的数据是没什么问题了。对于他的方法我感觉有很多不足的地方。
    1.存储过程的用了 EXEC(@sql) ,与其这样的话,还不如直接写sql查询语句呢,可以写成一个函数或者是 类,效率应该差不了多少。2.如果说是通用,那么就是说在不改变存储过程的情况下可以应付很多种情况,那么如果是两个或多个表联合呢?怎么做呀?好象只能对一个表翻页;
        如果要加查询条件呢?不是对表里的所有的记录翻页,只翻符合条件的怎么办呢?3.没有 总页数 、总记录数。4.只能按一个字段排序不能按多个字段排序。
    我的存储过程只是一个“模版”对于每个新的查询都要作一定的修改,虽然麻烦,但灵活性也就在其中——怎么改都可以。可以加查询条件,可以加联合表的语句。虽然不能按多个字段排序,但是把多出的排序字段转化为查询条件。大家可以到 http://news.sanhaoonline.com/listdetail.aspx 看一下。这个网页的翻页已经应用了这个存储过程。它可以按分类(两种分类)翻页、按查询条件翻页,都是一个页面,一个存储过程实现的。说了这些没有别的意思,只是希望大家能够取长补短,共同发展,一起进步。
      

  9.   

    问一下,这个怎么用到DataGrid里呢?
      

  10.   

    to  pxk(钻石很久远) 首先 我并没有说他是通用的。1.目前是不支持随机取页,不过我已经有比较好的解决办法。2.支持排序,但是只能对一个指定的字段排序,而且不能够动态更改排序字段。出现这两个问题的原因是1。存储过程的局限性 在存储过程里 top 后面是不能跟变量(比如@PageSize)的 ,order by 后面也是一样的2.实用性 你想一下翻到第50页,那么你知道第50页有什么内容吗?多数情况下是不知道的;
    如果你想浏览的话,为什么不从第一页开始呢?
    如果你想看你想看的内容的话,我有很高效的查询。这样会更受用户的欢迎。
    3.网站的总体性能
    因为没有找到一个很好的节省资源的解决方法。
      

  11.   

    http://blog.csdn.net/goody9807/archive/2004/12/03/203670.aspx
      

  12.   

    你的思路, 参数主要:
    1. 根据当前记录集的上限/下限
    2. 是否向下翻页来实现分页我现在的数据有50万以上的记录,
    分页解决方法当初也是这样实现的.
    但主要存在如下问题:1. 用户只是用"上一页", "下一页", 不能直接从第1页跳到第4页...
    2. 如果当前是第4页, 在另一个客户端有人将第4页前的记录删除了一些, 结果会怎?建议将
    @isNext bit=null,    --true 1 :下一页;false 0:上一页
    参数改成是
    @OldPageIndex int    --翻页前的页号
      

  13.   

    to SVG(ben)1.考虑到效率和实用性,暂时没有加 指定页的功能,不过现在已经有了一个比较好的方法。declare @ID int    --排序字段
    declare @i int
    declare @count int
    set @i=0
    set @count=0 --0:第二页 1:第三页 --由大到小排列
    select top 10 @ID=ID from table  order by ID desc --一页10条记录
    while @i< @count
    begin
    select top 10 @ID=ID from table  where ID<@ID  order by ID desc
    set @i=@i+1endselect top 10 *  from table  where ID<@ID  order by ID desc  --返回记录
    2.主要是用在前台页面,所以就不涉及到删除了。
      如果用于后台的话,那还要加好多的功能,比如更新当前页,更换排序字段等等。