根据name的排列取n-m之间
create_name
----------------
a
bf
bfsbfdbdf
cvwer
d
fedv
Gift Products Test Now Want three Days
hyt
mjy
wef
wf
-------------这是name 所有的数据
第一次我取1-5行sql是没有问题的
select  Gift_PID,Products_Name_En, 
convert(varchar,cast(Set_Points as money),1)as Set_Points,
if_FreeShipping,Products_List_Images,GiftsProducts_Hot,
If_Stock from (select  * , new_id = (select count(*) from Gift_productsInfo where t.Products_Name_En > Products_Name_En )+1 from Gift_productsInfo t )m
where  new_id between '1' and '5' and  
CataLog_ID='101' and Switch='on' order by Products_Name_En  ----------------
a
bf
bfsbfdbdf
cvwer
d---------------d?????????但第二次接着取下面的5行就有问题了6-10???
select  Gift_PID,Products_Name_En, 
convert(varchar,cast(Set_Points as money),1)as Set_Points,
if_FreeShipping,Products_List_Images,GiftsProducts_Hot,
If_Stock from (select  * , new_id = (select count(*) from Gift_productsInfo where t.Products_Name_En > Products_Name_En )+1 from Gift_productsInfo t )m
where  new_id between '6' and '10' and  
CataLog_ID='101' and Switch='on' order by Products_Name_En  
--------------------------
fedv
Gift Products Test Now Want three Days
hyt
---------??不知道怎么就取出3行了

解决方案 »

  1.   

    select top m-n *
    from 
    (
    select top m * from tb order by name asc
    ) order by name desc 
      

  2.   

    select  * from
    (select row=row_number() over(order by getdate()),* from tb) K
    where row between 1 and 5 
      

  3.   

    create table tb(create_name varchar(100))insert into tb select 
    'a' union all select 
    'bf' union all select 
    'bfsbfdbdf' union all select
    'cvwer' union all select
    'd' union all select
    'fedv' union all select
    'Gift Products Test Now Want three Days' union all select
    'hyt' union all select
    'mjy'union all select
    'wef' union all select
    'wf'--4到6
    declare @n int
    declare @m int
    declare @mn int
    select @n=4,@m=6
    select @mn = @m-@n +1exec('select top '+@mn+' *
    from 
    (
    select top '+@m+'* from tb order by create_name asc
    ) t order by create_name desc ')
    create_name                                                                                          
    ---------------------------------------------------------------------------------------------------- 
    fedv
    d
    cvwer
      

  4.   

    取n到m行1. 
    select top m * from tablename where id not in (select top n id from tablename order by id asc/*|desc*/) 2. 
    select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入到临时表 
    set rowcount n   --只取n条结果
    select * from 表变量 order by columnname desc 3. 
    select top n * from  
    (select top m * from tablename order by columnname) a 
    order by columnname desc 
    4.如果tablename里没有其他identity列,那么: 
    先生成一个序列,存储在一临时表中.
    select identity(int) id0,* into #temp from tablename 取n到m条的语句为: 
    select * from #temp where id0 > =n and id0  <= m 如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行: 
    exec sp_dboption 你的DB名字,'select into/bulkcopy',true 
    5.如果表里有identity属性,那么简单: 
    select * from tablename where identity_col between n and m  6.SQL2005开始.可以使用row_number() over()生成行号
    ;with cte as
    (
     select id0=row_number() over(order by id),* from tablename
    )
    select * from cte where id0 between n to m