>>>>但是实际运行速度却很慢把你的SQL语句贴出来, 或这么做如果你排序的话,第一次用
select top 100 * from yourtable order by SomeField记住每页的第一个和最后一个记录往后翻页,你用
select top 100 * from yourtable where SomeField > '最后一个记录' order by
SomeField往前翻页,你用
select * from (select top 100 * from yourtable where SomeField < '第一个
记录' order by SomeField desc ) t order by SomeField
>>>>不要告诉我用主键ID, 因为排序不一定是按照主键来的。实际上除了主键也没有其他的>>>>索引速度慢冤不得人, 祝你好运!
select top 100 * from yourtable order by SomeField记住每页的第一个和最后一个记录往后翻页,你用
select top 100 * from yourtable where SomeField > '最后一个记录' order by
SomeField往前翻页,你用
select * from (select top 100 * from yourtable where SomeField < '第一个
记录' order by SomeField desc ) t order by SomeField
>>>>不要告诉我用主键ID, 因为排序不一定是按照主键来的。实际上除了主键也没有其他的>>>>索引速度慢冤不得人, 祝你好运!
select Top pageSize *
from T
where SortField NOT IN (select Top pageSize*pagei SortField
from T
order by SortField )
order by SortField例如,每页7条,列印第7页:
select Top 10 *
from T
where SortField NOT IN (select Top 70 SortField
from T
order by SortField )
order by SortField
or CREATE PROCEDURE Get_Customers_By_Page
@CurrentPage int,
@PageSize int,
@TotalRecords int output
asSELECT identity(int,1,1) as id ,* into #TempTable from tableDECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize
SELECT @LastRec = (@CurrentPage * @PageSize + 1)SELECT
*
FROM
#TempTable
WHERE
ID > @FirstRec
AND
ID < @LastRecSELECT @TotalRecords = COUNT(*) FROM table
as
declare @sql varchar(8000)
set @sql = 'select top '+ cast(@num as varchar(100)) + ' * from 表'
exec(@sql)
create procedure cur_num @num int,@num1
as
declare @sql varchar(8000)
set @sql = 'select top '+ cast(@num as varchar(100)) + ' * from 表 where id >@num1'
exec(@sql)
你说的意思我明白,我也这样想过,但它的效率直在值得商榷,
比如说我想取得第 500001到500100 的100条记录,那么你的语句就是:
select Top 10 * from T
where SortField NOT IN (select Top 500000 SortField
from T order by SortField )order by SortField
效率很低吧。你的另一种方法也一样,先把这么多记录倒到另一个临时表中,也一定很慢。
to: saucer(思归, MS .NET MVP) :
你说的第一页用 select top 100 * ... 我能理解。但是以后的记录你用下面的语句:
select top 100 * from yourtable where SomeField > '最后一个记录' order by
SomeField
就有一个假设:SomeField 必须是唯一索引。 如果根本就没有索引的话,该怎么办呢。
我想要的其实就是类似 select between 500001 and 500100 * from T 的这样一个语句。但又要顾及到效率。
to wgy2008(北极光) :
你说的也只是显示头一百条时的情况。
以上的解决方法无非有以下几种:
1. 用 select top 100 * from T where .. not in ( select top beginIndex ... ), 但是当 beginIndex 很大的时候,比如 1000000, 这样做无疑效率很低。2. 利用索引,把每次查询后的索引值记录。但是当索引值重复很大或者根本没有索引时,这种方法就不行了。3. 用类似 oracle里的rowid, 但是 sql-server 里没有。 :-(我现在用的是 ado.net 里的 DbDataAdapter.Fill 方法里的功能来实现分页的,但是效率很低,所以想找一种能直接在数据库里实现的方法。各位大侠帮忙啊
select between N1 and N2 ...的语句呢?
数据库直接支持的效率显示是最高的