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

Откуда:
Сообщений: 13
Здравствуйте.
Была ситуация, когда глобальный курсор(по дефолту), внутри которого идет UPDATE на текущую выбранную запись, совершенно точно работал без зацикливания, после стал зацикливаться.
Исправил на CURSOR LOCAL STATIC.
Почему работал ранее? В какой ситуации @@FETCH_STATUS != 0 после UPDATE текущей записи /* дальше иная инструкция*/ - курсор перешел на tempdb?
24 сен 11, 01:47    [11330746]     Ответить | Цитировать Сообщить модератору
 Re: CURSOR GLOBAL / LOCAL STATIC  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ошибка была в 17й строке.
24 сен 11, 07:04    [11330991]     Ответить | Цитировать Сообщить модератору
 Re: CURSOR GLOBAL / LOCAL STATIC  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
mssql2008
В какой ситуации @@FETCH_STATUS != 0 после UPDATE текущей записи /* дальше иная инструкция*/ - курсор перешел на tempdb?
Загадочная фраза.

GLOBAL или LOCAL тут не при чём.
По-умолчанию курсор динамический (пока Вы его не объявили как STATIC).
Это означает, что в него моментально попадают записи, только что изменённые в таблице.
В том числе изменённые самим курсором. Грубо говоря, такой курсор "видит" текущее состояние таблицы.

Обычно SELECT курсора делают упорядоченным (ORDER BY) по каким-то полям.
Если в результате UPDATE изменённая запись попала в конец (условно говоря)
списка записей в соответсвии с ORDER BY, то рано или поздно курсор снова до неё доберётся.
Предположим, что UPDATE каждый раз "посылает" запись "вперёд" по списку записей курсора.
Тогда получаем зацикливание.
24 сен 11, 14:52    [11331561]     Ответить | Цитировать Сообщить модератору
 Re: CURSOR GLOBAL / LOCAL STATIC  [new]
mssql2008
Member

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

Да, про ORDER BY не подумал.
Спасибо
24 сен 11, 20:11    [11332169]     Ответить | Цитировать Сообщить модератору
 Re: CURSOR GLOBAL / LOCAL STATIC  [new]
mssql2008
Member

Откуда:
Сообщений: 13
Гавриленко Сергей Алексеевич,

=) листинг не привел намеренно
24 сен 11, 20:16    [11332179]     Ответить | Цитировать Сообщить модератору
 Re: CURSOR GLOBAL / LOCAL STATIC  [new]
mssql2008
Member

Откуда:
Сообщений: 13
Заметил вот какую особенность

Если писать SELECT TOP, то курсор перестает быть динамическим
@t остается неизменным (Это о загадочной фразе и tempdb)

DECLARE @t int
DECLARE vendor_cursor CURSOR LOCAL DYNAMIC FOR 
SELECT [u]TOP 2[/u] t
FROM _Test
OPEN vendor_cursor
FETCH NEXT FROM vendor_cursor 
INTO @t

WHILE @@FETCH_STATUS = 0
BEGIN
   UPDATE  _Test  
   SET t = 10
   SELECT @t
FETCH NEXT FROM vendor_cursor 
INTO @t
END 
CLOSE vendor_cursor
DEALLOCATE vendor_cursor
25 сен 11, 06:21    [11332757]     Ответить | Цитировать Сообщить модератору
 Re: CURSOR GLOBAL / LOCAL STATIC  [new]
в где что написано
Guest
mssql2008,

"текущую выбранную запись" какой командой апдейтите? в where что написано?
25 сен 11, 10:27    [11332792]     Ответить | Цитировать Сообщить модератору
 Re: CURSOR GLOBAL / LOCAL STATIC  [new]
mssql2008
Member

Откуда:
Сообщений: 13
в где что написано,

jap в третьим посте ответил на вопрос, это просто ремарка про TOP

Спасибо.
25 сен 11, 13:10    [11333019]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить