Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
subj собственно.. вроде если нужно получить первые n строк — проблем нет: select top n ... а что делать если нужны строки с 20 по 35 например? select top 20 ... select top 15? а сразу как-нибудь, да побыстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2001, 20:43 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
Варианты: 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) использовать перебор запроса на клиенте для выделения нужной части запроса. Но это самый плохой вариант, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2001, 00:11 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
Вариант длля случая, если нужно получить первые 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2001, 13:31 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
declare @var1 int set @var1 = 10 set rowcount @var1 select .... почему-то не работает, а.. set rowcount 10 select .... работает замечательно. в чем может быть дело? :| ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2001, 19:18 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
Просто в командах SET, устанавливающих параметры, нельзя использовать в качестве значений переменные или выражения - только константы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2001, 19:23 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
Странно а у меня комбинация SET ROWCOUNT @count Работает нормально, только я @count передаю как параметр процедуры. может я чего-то не правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2001, 19:29 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#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 ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2001, 22:43 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
Ребята, запостите, пожалуйста целиком код запроса... Просто я никак не могу себе представить целиком код... А так - может разберусь.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2001, 07:25 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
Имеем таблицы: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2001, 08:40 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
Спасибо большое - пойду разбираться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2001, 14:03 |
|
||
|
получение части результатов запроса
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2001, 14:31 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32002225&tid=1825661]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 327ms |

| 0 / 0 |
