Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
Имеется курсор по таблице, потенциально содержащей в будущем сотни тысяч записей. Одна из колонок - ID, не отсортированная (так надо).
Циклическим пробеганием курсором по рекордсету я ищу определенный ID, а также предыдущий и следующий (для пейджинга в проекте).

Вопрос - можно ли обойтись без цикла и сразу позиционировать курсор на записи с нужным ID, чтобы потом сделать FETCH NEXT / LAST и достать еще две нужные соседние ID?
21 окт 09, 02:28    [7814994]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
И всё же не понятно... При построении курсора какая-либо сортировка используется (иначе, курсор бессмысленен, ИМХО)?
21 окт 09, 06:29    [7815054]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
для paging курсор бессмысленен, ещё мение бессмысленен пассаж автора
автор
Циклическим пробеганием курсором по рекордсету я ищу определенный ID, а также предыдущий и следующий
.
21 окт 09, 07:14    [7815072]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
somebody
Member

Откуда: Москва
Сообщений: 708
автор
Одна из колонок - ID, не отсортированная

Если колонка - не отсортированная, как определите вот это:
автор
предыдущий и следующий
?
Тогда вообще можете брать 2 любых ID в качестве предыдущего и следующего ). Ибо физический порядок записей в курсоре без сортировки не гарантируется.

P. S. Для установки курсора на строку с нужным № используется fetch absolute, но здесь, похоже, не тот случай.
21 окт 09, 10:10    [7815535]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
Пояснения:

Несколько таблиц джойнятся в один рекордест по определенным условиям, рекордсет сортируется по заранее неизвестной колонке (передается в процедуру). Соответственно, IDы этих записей будут в неопределенном порядке. Для пейджинга мне необходимо знать предыдущую и следующую записи от текующей, точнее, их IDs.


Условно - есть грид с листом объектов, отсортированный в sql по определенной колонке. Кликаем на ID объекта, переходим на страницу, где данные по объекту и кнопки Prev и Next. Задача была - за один раз достать сам объект (по ID). а также его соседние (в зависимости от условий сортировки на предыдущей странице) IDs.
21 окт 09, 10:18    [7815589]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
нечё , что данного ид может уже не существовать ? начните с простого - прочитайте как это реализовано уже . на кодепрожекте есть, аспешники и пхп у себя реализуют.
21 окт 09, 10:22    [7815621]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Вот далеко не надо ходить
21 окт 09, 10:23    [7815629]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
Прецедура sql-сортировки и возвращения нужной страницы клиенту уже есть, и работает отлично. При переходе на другую страницу грида выполняется тот же запрос и возвращается вторая страница. Это реализовано и работает ок.

Проблема в другом. В гриде есть колонка с ID объектов. Записи в гриде возвращены из процедуры по определенной сортировочной колонке. Соотвественно, колонка ID может иметь хаотичный вид. При клике на ID переходим на другую .net страницу, где показываем данные об объекте. На той странице есть кнопки Prev/Next. При клике на них должны иметь возможность перейти на следующий объект из страницы грида, в том числе и на другую страницу грида, если "докликали" до начала/конца грида. То есть кнопка Next должна физически позволять очередно просмотреть ВСЕ объекты, независимо от страницы пейджинга грида.

Соответственно, проблема не в том, КАК вернуть записи постранично из процедуры, а как ползать по ПОЛНОЙ коллекции на другой .net странице, кликая next/prev кнопки.
21 окт 09, 13:03    [7817156]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Takhir

Соответственно, проблема не в том, КАК вернуть записи постранично из процедуры, а как ползать по ПОЛНОЙ коллекции на другой .net странице, кликая next/prev кнопки.

А сервер тут с какой стороны тогда ?
21 окт 09, 13:12    [7817210]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
Glory
Takhir

Соответственно, проблема не в том, КАК вернуть записи постранично из процедуры, а как ползать по ПОЛНОЙ коллекции на другой .net странице, кликая next/prev кнопки.

А сервер тут с какой стороны тогда ?


Коллекция объектов для страницы грида достается из базы процедурой А, сеттится в грид и ни в сессию, ни во вьюстейт не кладется. Соотв-но, максимум, что есть - это ID (гиперлинк объекта с редиректом информационную страницу объекта). При клике на ID юзается процедура Б, которая возращает полный объект со всеми данными, он отображается на информационной странице. Там же и кнопки Next/Prev, IDы на которых достаются из той же процедуры Б. Я уже описывал, как - юзанием курсора.
21 окт 09, 13:17    [7817243]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Takhir
Glory
Takhir

Соответственно, проблема не в том, КАК вернуть записи постранично из процедуры, а как ползать по ПОЛНОЙ коллекции на другой .net странице, кликая next/prev кнопки.

А сервер тут с какой стороны тогда ?


Коллекция объектов для страницы грида достается из базы процедурой А, сеттится в грид и ни в сессию, ни во вьюстейт не кладется. Соотв-но, максимум, что есть - это ID (гиперлинк объекта с редиректом информационную страницу объекта). При клике на ID юзается процедура Б, которая возращает полный объект со всеми данными, он отображается на информационной странице. Там же и кнопки Next/Prev, IDы на которых достаются из той же процедуры Б. Я уже описывал, как - юзанием курсора.

У курсора TSQL есть только один метод позиционирования - FETCH. С документированными параметрами. Выбирайте любой
21 окт 09, 13:19    [7817263]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Takhir
Glory
Takhir

Соответственно, проблема не в том, КАК вернуть записи постранично из процедуры, а как ползать по ПОЛНОЙ коллекции на другой .net странице, кликая next/prev кнопки.

А сервер тут с какой стороны тогда ?


Коллекция объектов для страницы грида достается из базы процедурой А, сеттится в грид и ни в сессию, ни во вьюстейт не кладется. Соотв-но, максимум, что есть - это ID (гиперлинк объекта с редиректом информационную страницу объекта). При клике на ID юзается процедура Б, которая возращает полный объект со всеми данными, он отображается на информационной странице. Там же и кнопки Next/Prev, IDы на которых достаются из той же процедуры Б. Я уже описывал, как - юзанием курсора.

И что в вашем понимании должен делать сервер в ответ на нажатие кнопки Prev/Next в вашем клиенте?
21 окт 09, 13:19    [7817266]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
iljy
Takhir
Glory
Takhir

Соответственно, проблема не в том, КАК вернуть записи постранично из процедуры, а как ползать по ПОЛНОЙ коллекции на другой .net странице, кликая next/prev кнопки.

А сервер тут с какой стороны тогда ?


Коллекция объектов для страницы грида достается из базы процедурой А, сеттится в грид и ни в сессию, ни во вьюстейт не кладется. Соотв-но, максимум, что есть - это ID (гиперлинк объекта с редиректом информационную страницу объекта). При клике на ID юзается процедура Б, которая возращает полный объект со всеми данными, он отображается на информационной странице. Там же и кнопки Next/Prev, IDы на которых достаются из той же процедуры Б. Я уже описывал, как - юзанием курсора.

И что в вашем понимании должен делать сервер в ответ на нажатие кнопки Prev/Next в вашем клиенте?


На этой же .net странице после PostBack вернуть следующий объект...
21 окт 09, 14:06    [7817739]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Takhir

На этой же .net странице после PostBack вернуть следующий объект...

Сервер может вернуть только то, что вы скажите ему возвращать через переданную команду
21 окт 09, 14:08    [7817762]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Takhir

На этой же .net странице после PostBack вернуть следующий объект...

Ну так напишите процедуру, которая будет на основании ID получать следующий-предыдущий, и дергайте ее. А проще - сохраните на клиенте список ID, возвращенный процедурой А.
21 окт 09, 14:19    [7817852]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
iljy
Takhir

На этой же .net странице после PostBack вернуть следующий объект...

Ну так напишите процедуру, которая будет на основании ID получать следующий-предыдущий, и дергайте ее. А проще - сохраните на клиенте список ID, возвращенный процедурой А.


Эх... читаем все вместе все мои написанные ранее посты.
Повторюсь:

1. Процедура А возвращает текущую СТРАНИЦУ из всего рекордсета для грида.
2. Сохранять на клиенте весь список ID - неразумно, и этот подход ограничен (если записей будет миллион....)
3. Процедура, которая по ID возращает также предыдущий и следующий - уже написана. Опять же - читаем ВСЕ мои посты.
4. Вопрос был всего лишь - можно ли сразу перейти на нужную строку курсором ПО УСЛОВИЮ? Например, я знаю ID объекта. Вместо того, чтобы бежать курсором по рекордсету и сравнивать вытащенный ID с известным, я бы хотел сразу перейти на нужную позицию.
21 окт 09, 19:05    [7820220]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36824
Takhir
iljy
Takhir

На этой же .net странице после PostBack вернуть следующий объект...

Ну так напишите процедуру, которая будет на основании ID получать следующий-предыдущий, и дергайте ее. А проще - сохраните на клиенте список ID, возвращенный процедурой А.


Эх... читаем все вместе все мои написанные ранее посты.
Повторюсь:

1. Процедура А возвращает текущую СТРАНИЦУ из всего рекордсета для грида.
2. Сохранять на клиенте весь список ID - неразумно, и этот подход ограничен (если записей будет миллион....)
3. Процедура, которая по ID возращает также предыдущий и следующий - уже написана. Опять же - читаем ВСЕ мои посты.
4. Вопрос был всего лишь - можно ли сразу перейти на нужную строку курсором ПО УСЛОВИЮ? Например, я знаю ID объекта. Вместо того, чтобы бежать курсором по рекордсету и сравнивать вытащенный ID с известным, я бы хотел сразу перейти на нужную позицию.
Читать, пока не дойдет: https://www.sql.ru/forum/actualthread.aspx?tid=705341#7817263

Сообщение было отредактировано: 21 окт 09, 19:07
21 окт 09, 19:07    [7820228]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
Glory
Takhir

На этой же .net странице после PostBack вернуть следующий объект...

Сервер может вернуть только то, что вы скажите ему возвращать через переданную команду


Ваш коммент эквивалентен 2*2=4
21 окт 09, 19:07    [7820229]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Takhir

Эх... читаем все вместе все мои написанные ранее посты.
Повторюсь:

1. Процедура А возвращает текущую СТРАНИЦУ из всего рекордсета для грида.
2. Сохранять на клиенте весь список ID - неразумно, и этот подход ограничен (если записей будет миллион....)
3. Процедура, которая по ID возращает также предыдущий и следующий - уже написана. Опять же - читаем ВСЕ мои посты.
4. Вопрос был всего лишь - можно ли сразу перейти на нужную строку курсором ПО УСЛОВИЮ? Например, я знаю ID объекта. Вместо того, чтобы бежать курсором по рекордсету и сравнивать вытащенный ID с известным, я бы хотел сразу перейти на нужную позицию.

А теперь включаем мозг и начинаем думать.
1. И в чем проблема? Сохраните эту страницу, как дойдете до края - счатаете предыдущую/следующую.
2. В таком случае вы будете сохранять ИД постранично
2.1 Не думаю, что пользователь будет листать миллион записей.
2.2 А даже если и будет - в чем проблема? у вас 4мегов памяти на клиентской машине нет? Или 8 - под бигинт?
3. Вот это вот
Takhir
Циклическим пробеганием курсором по рекордсету я ищу определенный ID, а также предыдущий и следующий (для пейджинга в проекте).

не означает, что написана процедура.
4. Я вообще не понимаю при чем тут курсор. Вы для доступа используете наверняка какие-то точканутые или адошные компоненты - так вот у них есть собственные методы перехода по рекордсету, а так же закладки для возврата.
21 окт 09, 19:17    [7820251]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
aleks2
Guest
Takhir
Вместо того, чтобы бежать курсором по рекордсету и сравнивать вытащенный ID с известным, я бы хотел сразу перейти на нужную позицию.


1. Эта фраза явно демонстрирует, что гуру форума и тредстартер толкуют о разном.
2. Тредстартер не знает, что такое курсор MS SQL и путает его с рекордсетом ADO.
3. В рекордсете ADO есть методы поиска и позиционирования. Достаточно ознакомиться с документацией.
21 окт 09, 19:27    [7820275]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Takhir
Member

Откуда:
Сообщений: 44
aleks2
Takhir
Вместо того, чтобы бежать курсором по рекордсету и сравнивать вытащенный ID с известным, я бы хотел сразу перейти на нужную позицию.


1. Эта фраза явно демонстрирует, что гуру форума и тредстартер толкуют о разном.
2. Тредстартер не знает, что такое курсор MS SQL и путает его с рекордсетом ADO.
3. В рекордсете ADO есть методы поиска и позиционирования. Достаточно ознакомиться с документацией.


2 - Если бы мои процедуры с курсорами не работали, я бы, может, и не знал, что такое курсор MS SQL. Но Вы ошиблись, к сожалению.
22 окт 09, 10:06    [7821754]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Takhir
Glory
Takhir

На этой же .net странице после PostBack вернуть следующий объект...

Сервер может вернуть только то, что вы скажите ему возвращать через переданную команду


Ваш коммент эквивалентен 2*2=4

Ну так в чем проблема то ? Вы не можете написать нужную команду ?
22 окт 09, 10:08    [7821766]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Takhir

2 - Если бы мои процедуры с курсорами не работали, я бы, может, и не знал, что такое курсор MS SQL. Но Вы ошиблись, к сожалению.


тогда объясните пожалуйста, каким образом ваше клиентское приложение циклически пробегает серверным курсором по рекордсету. Сие феерическое зрелище явно за пределами моего понимания.
22 окт 09, 10:45    [7822113]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Takhir
2 - Если бы мои .... , я бы, может, и не знал, что такое курсор MS SQL.


вы не знаете, что такое курсоры в скуле.
22 окт 09, 11:10    [7822321]     Ответить | Цитировать Сообщить модератору
 Re: Как перейти в курсоре по условию?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
Takhir

2 - Если бы мои процедуры с курсорами не работали, я бы, может, и не знал, что такое курсор MS SQL. Но Вы ошиблись, к сожалению.


тогда объясните пожалуйста, каким образом ваше клиентское приложение циклически пробегает серверным курсором по рекордсету. Сие феерическое зрелище явно за пределами моего понимания.
Это как раз несложно (для курсора SCROLL - FETCH FIRST, FETCH NEXT и т.п. + проверка @@FETCH_STATUS).
Но вот зачем так криво всё делать понадобилось, действительно непонятно.
Клиентские гриды + компоненты доступа к данным типа ADO для этого куда лучше приспособлены.
22 окт 09, 11:13    [7822349]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить