select  col1,col2 from tb order by col1 ,主键(或候选键)

解决方案 »

  1.   

    Select  top 2  col1,col2From aOrder by col1,col2下一页取大于当前页的col1+col2值的记录.
      

  2.   

    select idrow = identity(int,1,1) ,* into # from table
    再select * from # where idrow < 3
      

  3.   

    CREATE proc pro_getpage
    (@sqlstr nvarchar(4000), --查询字符串
             @pagecount int=1,        --第N页
     @pagesize int=99999999)        --每页行数
    as
    begin
    set nocount on
    declare @P1 int--P1是游标的id
    set @pagecount=(@pagecount-1)*@pagesize+1
    exec sp_cursoropen @P1 output,@sqlstr
      exec sp_cursorfetch @P1,16,@pagecount,@pagesize 
    exec sp_cursorclose @P1
    end
      

  4.   

    谢谢大家,对我很有启发。但是还要问一下,Oracle或者Db2这样的数据库在同样的sql下就不会出现这样的问题,是sqlserver的问题吗?有没有理论支持的?
      

  5.   

    在sql server中, 同样的sql语句, 只要你没有改表结构, 每次执行的顺序也是一样的.当然, 如果你的数据变化太大, 导致sql要选择另一种查询方法效率才优的话, 则数据的顺序也会改变.
    orace.db2这些数据库系统一样存在和sql server一样的问题.
    高级的数据库都存在根据你的查询语句和表结构对处理方法的优选问题, 所以都会存在同样的sql语句, 在不同的结构, 或者数据差异很大的两次查询中, 顺序不一致的情况.
      

  6.   

    另外, 在sql server中, 要注意一个统计信息的问题, sql server依据统计信息决定如何为你的处理语句选择合适的索引, 如果缺少某些统计信息, 会导致sql server在优化语句时找不到依据, 这样会导致即使表结构和数据没有任何变化, 也会产生每次查询结果的顺序不一致的现象.
    如果你遇到这种现象, 则复制你的查询语句到查询分析器中, 按Ctr+L对你的语句进行分析, 如果在分析结果中, 你看到某些对象的对象名中出现红色字体, 则说明缺少统计信息, 这时, 在这些对象上右键--创建缺少的统计, 当所有缺少的统计都正确创建后, 每次查询结果顺序不一致的现象就会消失
      

  7.   

    谢谢楼上,明白许多了。
    我按照你教的方法做了一下,发现一些对象图里有A->Z这样的红色,但右键以后“创建缺少的统计”是灰色的。
    我的sql是:(每页20条记录,下一次翻页时这个sql中的477会变成457再运行。但结果有两条是重复的,同样的sql在oracle里是不重复的)
    select Top 20 * from ( 
    select Top 477 * from (    
    select dp.deptname,
    i.itemcode,
    i.prdn as itemname,
    sum(b.qty) as qty ,
    sum(c.costprice*b.qty) as cost,
    sum(b.pretaxamount) as amount,
    sum(b.pretaxamount)-sum(c.costprice*b.qty) as profit  ,
    case  when sum(b.pretaxamount)=0 then 0  when sum(b.pretaxamount)-sum(c.costprice*b.qty)=0 then 0 else (sum(b.pretaxamount)-sum(c.costprice*b.qty))/sum(b.pretaxamount) end as profitrate from invoice a,
    invoicedetail b,
    ckitem i ,
    billing c,
    contact co 
    left join employee em 
    left join department dp on em.deptid=dp.deptid on co.employeeid=em.employeeid   WHERE 1=1   
    and b.itemid=i.itemid   
    and b.billingid=c.billingid   
    and a.invoiceid=b.invoiceid   
    and invoicetype=1   
    and a.booksetid=2000000003   
    and co.contactid=a.salesrep   
    and a.status=80                     GROUP BY  dp.deptname,
    i.itemcode,
    i.prdn     )  F order by F.deptname  asc ) G order by G.deptname DESC
      

  8.   

    如果你是中文版, 会看到明确的"缺少统计..."
    如果你是英文版, 会看到明确的"miss sta...."看到这些信息才可能说明是缺少统计信息, 另外, 右键要在对象上右键