получение части результатов запроса

Brand
Дата: 13.02.2001 20:43:33
subj собственно.. вроде если нужно получить первые n строк — проблем нет:
select top n ... а что делать если нужны строки с 20 по 35 например?
select top 20 ... select top 15?
а сразу как-нибудь, да побыстрее
Dmitry
Дата: 14.02.2001 00:11:43
Варианты:
1) Объявить курсор. С помощью Fetch Absolute Установиться куда нужно и вперед - забрасываешь во вревенную таблицу либо целиком строчки результирующего запрса, либо ключи. А потом соответственно из этой временной таблицы уже брать результат Select-ом.

Встречный вопрос - кто знает как работает внутри этот самый Fetch Absolute? Перебирает строчки вхолостую по одной до тех пор пока не дойде до указанной или как то умеет сразу установится куда нужно?
2) Create #temp (id int identity, ...)
/* Под ... понимается структура рез. запроса*/
Insert into #temp
select ... from ... where .... -это запрос часть которого надо получить
select from #temp where id between 20 and 35
Опять же при желании можно в #temp кидать только ключи.
3) Использовать соотв. методы ADO
4) использовать перебор запроса на клиенте для выделения нужной части запроса. Но это самый плохой вариант, конечно.
VadimB
Дата: 14.02.2001 13:31:06
Вариант длля случая, если нужно получить первые n строк,
КОТОРЫЕ ОТСОРТИРОВАННЫ ПО УНИКАЛЬНЫМ КЛЮЧАМ.

declare @StartRecord int
declare @RecordInPage int
declare @MaxKey varchar(255)

-- строки с 200 по 235
set @StartRecord=200
set @RecordInPage=35

set rowcount @StartRecord
select @MaxKey= max(UK) from T order by UK -- нати максимальный уникальный ключ для первых @StartRecord записей
set rowcount 0

set rowcount @RecordInPage
select * from T where UK > @MaxKey order by UK -- выдать @RecordInPage записей, пропустив первые @StartRecord записей
set rowcount 0
Brand
Дата: 14.02.2001 19:18:30
declare @var1 int
set @var1 = 10
set rowcount @var1
select ....
почему-то не работает, а..
set rowcount 10
select ....
работает замечательно. в чем может быть дело? :|
Garya
Дата: 14.02.2001 19:23:28
Просто в командах SET, устанавливающих параметры, нельзя использовать в качестве значений переменные или выражения - только константы.
Alexander Rudenko
Дата: 14.02.2001 19:29:46
Странно а у меня комбинация
SET ROWCOUNT @count
Работает нормально, только я @count передаю как параметр процедуры.
может я чего-то не правильно понял?
Дед Маздай
Дата: 14.02.2001 22:43:18
Syntax: SET ROWCOUNT { number | @number_var } - так что все должно работать (и работает) нез. от того, п-р это или нет.
Суть на с.д. не в этом, а в том, что set rowcount никак не влияет на план запроса - тот все равно выполняется весь и до конца, а потом уже из него выбирается rowcount записей. Предикат top, напротив, встраивается в план и учит.статистику, поэт.на больших данных он, конечно, лучше. След., пред.пример можно переписать как
declare @StartRecord bigint, @MaxKey int
set @StartRecord = 200
declare @s nvarchar(4000)
set @s = 'select top ' + cast(@StartRecord as varchar(10)) + ' @p = UK from T order by UK'
exec sp_executesql @s, N'@p int out', @MaxKey out
...
CrazyMike
Дата: 03.09.2001 07:25:58
Ребята, запостите, пожалуйста целиком код запроса... Просто я никак не могу себе представить целиком код... А так - может разберусь....
bitof
Дата: 03.09.2001 08:40:07
Имеем таблицы:
TBL1 - исходная
TBL2 - вспомогательная

TBL1:
----
fld1
fld2
...
fldn

TBL2
---
rowID int identity
fld1,
fld2,
...
fldn

дальше все просто:

truncate table TBL2
go
insert into TBL2 (fld1, fld2, ..., fldn)
select fld1, fld2, ..., fldn from TBL1
go
delete from TBL2 where rowID<@N_Low or rowID>@N_High
go
select fld1, fld2,..., fldn from TBL2
CrazyMike
Дата: 03.09.2001 14:03:43
Спасибо большое - пойду разбираться...