取n到m行
1.
selecttop m *from tablename where id notin (selecttop n id from tablename orderby id asc/*|desc*/)
2.
selecttop m *into 临时表(或表变量) from tablename orderby columnname -- 将top m笔插入到临时表 setrowcount n --只取n条结果select*from 表变量 orderby columnname desc3.
selecttop n *from
(selecttop m *from tablename orderby columnname) a
orderby columnname desc4.如果tablename里没有其他identity列,那么:
先生成一个序列,存储在一临时表中.
selectidentity(int) id0,*into #tempfrom tablename
取n到m条的语句为:
select*from #tempwhere id0 >=n and id0 <= m
如果你在执行select identity(int) id0,*into #tempfrom 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(orderby id),*from tablename
)
select*from cte where id0 between n to m
--先选出前600条,再在其中选出需要的记录,只扫描一次表select*from
(
select*,rn=row_number() over(orderby id)
from
(
selecttop604*from sys_type
orderby id
) a
) b
where rn between500and604
IfObject_id('Test','U') IsNotNullDropTable Test
GoCreateTable Test(id intIdentity(1,1) PrimaryKey,x bit)
InsertInto Test
SelectTop5000000From sys.all_objects ,sys.all_columns
GoDeleteFrom Test Where id=56--删除一行,用于测试
;With t As
(Select Row=Row_number() Over (OrderBy id),id,x From Test)
Select id,x From t Where Row Between600And604/*
id x
----------- -----
601 0
602 0
603 0
604 0
605 0
*/