powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / получение части результатов запроса
12 сообщений из 12, страница 1 из 1
получение части результатов запроса
    #32002223
Brand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
subj собственно.. вроде если нужно получить первые n строк — проблем нет:
select top n ... а что делать если нужны строки с 20 по 35 например?
select top 20 ... select top 15?
а сразу как-нибудь, да побыстрее
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32002225
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианты:
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) использовать перебор запроса на клиенте для выделения нужной части запроса. Но это самый плохой вариант, конечно.
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32002243
VadimB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант длля случая, если нужно получить первые 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
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32002265
Brand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
declare @var1 int
set @var1 = 10
set rowcount @var1
select ....
почему-то не работает, а..
set rowcount 10
select ....
работает замечательно. в чем может быть дело? :|
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32002267
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто в командах SET, устанавливающих параметры, нельзя использовать в качестве значений переменные или выражения - только константы.
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32002269
Alexander Rudenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно а у меня комбинация
SET ROWCOUNT @count
Работает нормально, только я @count передаю как параметр процедуры.
может я чего-то не правильно понял?
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32002274
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32013354
CrazyMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, запостите, пожалуйста целиком код запроса... Просто я никак не могу себе представить целиком код... А так - может разберусь....
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32013358
bitof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем таблицы:
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
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32013380
CrazyMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое - пойду разбираться...
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32013384
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO предложенный код не вполне оптимален(копировать целиком исходную таблицу, а затем удалять большинство записей?) и корректен (если TBL2 -постоянная таблица, то как все это будет работать в многопользовательской среде, когда несколько пользователей попытаются получать свои данные ?)

Я бы предложил такой вариант в виде процедуры, исходя из

- основная таблица mytable имеет PRIMARY KEY любого типа (я выбрал поле myid, int, IDENTITY для простоты)


CREATE PROCEDURE paging (@lowest_rec int, @highest_rec int) AS

/*создаем временную таблицу, cast пришлось использовать из-за IDENTITY*/
select identity(int, 1,1) as id_tmp, cast(myid as int) as myid into #tmp_paging from mytable where 1=2

/*нумеруем записи из основной таблицу, можно добавить where и order*/
insert into #tmp_paging(myid) select myid from mytable

/*выбираем нужные записи*/
select t.* from #tmp_paging as tmp inner join mytable as t on tmp.id=t.myid
where tmp.id_tmp BETWEEN @lowest_rec AND @highest_rec
...
Рейтинг: 0 / 0
получение части результатов запроса
    #32013385
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, ошибочка вышла в последнем запросе

select t.* from #tmp_paging as tmp inner join mytable as t on tmp. myid =t.myid
where tmp.id_tmp BETWEEN @lowest_rec AND @highest_rec
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / получение части результатов запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]