Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 sp_cursoropen с процедурой  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1199
В документации есть пример как использовать sp_cursoropen с вызовом процедуры:

DECLARE @cursor INT
DECLARE @retval INT

EXEC sp_cursoropen @cursor OUTPUT, 'EXEC @P1=myProc @P2', 2, 8193, N'@P1 INT OUTPUT, @P2 INT', @retval, 1


Где ошибка?
DECLARE @from int;
DECLARE @cout int;

set @from = 1;
set @cout = 2;

DECLARE @handle int;


EXEC sp_cursoropen
	@handle OUTPUT,
	'EXEC dbo.prc_mag_sad_masterClass_getMasterClassLinks @id_masterClass',
	2, 8193,
	'@id_masterClass INT', 12;

EXEC sp_cursorfetch
  @handle,
  16,     -- Absolute row index
  @from, -- Fetch from row
  @cout -- Rows count to fetch

EXEC sp_cursorclose @handle;

EXEC sp_cursorclose @handle;

Пишет вот такую ошибку:
Msg 16902, Level 16, State 25, Procedure sp_cursoropen, Line 1
sp_cursoropen: The value of the parameter 'rowcount' is invalid.
Msg 16909, Level 16, State 1, Procedure sp_cursorfetch, Line 1
sp_cursorfetch: The cursor identifier value provided (0) is not valid.
Msg 16909, Level 16, State 1, Procedure sp_cursorclose, Line 1
sp_cursorclose: The cursor identifier value provided (0) is not valid.

25 июн 08, 17:29    [5847686]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
При таком вызове надо именовать параметры вызова.
Иначе, 5-ый параметр по счету должен быть @rowcount, а у вас - описание параметров целевой процедуры

--------------------------------------------------------------------------------------------------
Света не светит, Маша не машет, Катя не катит, Люба не любит.
Одна Даша молодец.
25 июн 08, 17:43    [5847799]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1199
Вот так?

DECLARE @from int;
DECLARE @cout int;

set @from = 1;
set @cout = 2;

DECLARE @handle int;


EXEC sp_cursoropen
	@cursor = @handle OUTPUT,
	@stmt = 'EXEC dbo.prc_mag_sad_masterClass_getMasterClassLinks @id_masterClass',
	@scrollopt = 2,
	@ccopt = 8193,
	@paramdef = '@id_masterClass INT',
	@id_masterClass = 12;

EXEC sp_cursorfetch
  @handle,
  16,     -- Absolute row index
  @from, -- Fetch from row
  @cout -- Rows count to fetch

EXEC sp_cursorclose @handle;

Таже ошибка...
25 июн 08, 17:57    [5847948]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: sp_cursoropen с процедурой  [new]
mikola1982
Member

Откуда:
Сообщений: 587
нашли решение?
5 дек 11, 11:19    [11705428]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
mikola1982
нашли решение?
Наверняка нашли, 3 года прошло всё таки.
5 дек 11, 11:49    [11705709]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
mikola1982
Member

Откуда:
Сообщений: 587
alexeyvg,

похоже что нет. скорее сделали как-то подругому
5 дек 11, 13:39    [11706530]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
автор
скорее сделали как-то подругому
И правильно. Кому эти курсоры сдались.
5 дек 11, 14:23    [11706979]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
mikola1982
Member

Откуда:
Сообщений: 587
Mnior,

предложите как можно сделать постраничную выборку данных
5 дек 11, 18:01    [11709232]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
mikola1982, А оно вам нужно?

Привёдите реальный пример, и потом увидите, что оно там не нужно.
5 дек 11, 18:15    [11709337]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
mikola1982
Member

Откуда:
Сообщений: 587
Mnior,

есть таблица в ней 1000000 строк, необходимо подымать на верх данные порциями по 100, 500 ...в общем выбирается пользователем,
Проще говоря отображение данных листами по определенному количеству строк.
при этом пользователь может задавать сортировку по одному из столбцов или наложить фильтр на несколько столбцов.
5 дек 11, 18:47    [11709504]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
mikola1982
Проще говоря отображение данных листами по определенному количеству строк.
В факе есть описания разных вариантов постраничной выборки
https://www.sql.ru/faq/faq_topic.aspx?fid=105
5 дек 11, 18:57    [11709545]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
mikola1982
Member

Откуда:
Сообщений: 587
alexeyvg,

спасибо.
читал, но по скорости серверный курсор вроде один из самых быстрых.
Но с ним затык, не получается привязать параметры, пишет что необходимо объявить переменную
5 дек 11, 19:05    [11709580]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
mikola1982
Но с ним затык, не получается привязать параметры, пишет что необходимо объявить переменную
Конечно, для вызова процедуры нужно правильно передать параметры.

Непонятно, как вы эту процедуру вызываете и какая у вас версия сиквела. Я думаю, если вы напишете правильный вызов, то всё заработает.

Ещё есть такая проблема, что sp_cursoropen недокументирована, и формат вызова может меняться.
5 дек 11, 19:11    [11709592]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
mikola1982
но по скорости серверный курсор вроде один из самых быстрых.
Один из - это не самый быстрый, ну и про недостатки использования недокументированных возможностей тоже не надо забывать.
5 дек 11, 19:12    [11709597]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
mikola1982
Member

Откуда:
Сообщений: 587
alexeyvg
mikola1982
Но с ним затык, не получается привязать параметры, пишет что необходимо объявить переменную
Конечно, для вызова процедуры нужно правильно передать параметры.

Непонятно, как вы эту процедуру вызываете и какая у вас версия сиквела. Я думаю, если вы напишете правильный вызов, то всё заработает.

Ещё есть такая проблема, что sp_cursoropen недокументирована, и формат вызова может меняться.

все верно говорите. проблема скорее всего в том что в 2008 эта функция имеет уже другой вариант вызова чем в имеющейся документации
5 дек 11, 19:44    [11709684]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
mikola1982
Member

Откуда:
Сообщений: 587
alexeyvg,

а вы какой вариант можете посоветовать?
который на ваш взгляд самый быстрый?
5 дек 11, 19:44    [11709689]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
mikola1982
alexeyvg,

а вы какой вариант можете посоветовать?
который на ваш взгляд самый быстрый?
По моему, вариант из комментариев от 16 апреля 2008 хороший.

Тут как то обсуждали... Вариант с ROW_NUMBER() то же вроде быстрый...
mikola1982
alexeyvg
пропущено...
Конечно, для вызова процедуры нужно правильно передать параметры.

Непонятно, как вы эту процедуру вызываете и какая у вас версия сиквела. Я думаю, если вы напишете правильный вызов, то всё заработает.

Ещё есть такая проблема, что sp_cursoropen недокументирована, и формат вызова может меняться.

все верно говорите. проблема скорее всего в том что в 2008 эта функция имеет уже другой вариант вызова чем в имеющейся документации
Вы бы свой вариант вызова привели. По моему, несложно найти правильный вариант, в крайнем случае профайлером подсмотреть.
5 дек 11, 20:24    [11709806]     Ответить | Цитировать Сообщить модератору
 Re: sp_cursoropen с процедурой  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
mikola1982
постраничную выборку данных
К вышесказанному добавить только одно:
Варианты решений могут выходить за пределы скуля.

Пример (гипотетический): вы можете создать сразу все результаты, нарезать сразу все страницы. Далее просто замапить nginx на соответствкющий файл для каждой страницы.
Для больших объёмов использовать подход логической нарезки: не по номеру строки, а по некоторому показателю (фильтровка данных).
6 дек 11, 11:39    [11711895]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить