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

Откуда:
Сообщений: 625
Если набор данных не вернет ни одной строчки, курсор будет открываться или нет
DECLARE
	CUR CURSOR FOR 
SELECT GETDATE()
WHERE 1 = 2
OPEN CUR
FETCH NEXT FROM CUR 
WHILE @@FETCH_STATUS = 0
BEGIN

   FETCH NEXT FROM CUR
END

CLOSE CUR
DEALLOCATE CUR
13 май 15, 07:28    [17631962]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли открываться курсор если набор не вернет ни одной строчки  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
DECLARE CUR CURSOR FOR SELECT GETDATE() WHERE 1 = 2
	SELECT CURSOR_STATUS('global','cur') AS 'After declare'
OPEN CUR
	SELECT CURSOR_STATUS('global','cur') AS 'After open'
FETCH NEXT FROM CUR 
WHILE @@FETCH_STATUS = 0
BEGIN
	SELECT CURSOR_STATUS('global','cur') AS 'After FETCH'
    FETCH NEXT FROM CUR
END
CLOSE CUR
SELECT CURSOR_STATUS('global','cur') AS 'After CLOSE'
DEALLOCATE CUR
SELECT CURSOR_STATUS('global','cur') AS 'After DEALLOCATE'


1 The cursor allocated to this variable is open.
0 The cursor allocated to this variable is open, but the result set is definitely empty.*
-1 The cursor allocated to this variable is closed.
-2 There is no cursor assigned to a declared cursor variable.
-3 A cursor with the specified name does not exist.
13 май 15, 07:47    [17631977]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли открываться курсор если набор не вернет ни одной строчки  [new]
abort
Member

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

все таки статус = 0 The cursor allocated to this variable is open, but the result set is definitely empty.*
я так понял, что курсор все таки открывается, но с пустым набором данных.
Дело в том, что планирую использовать такой скрипт каждые 5 минут. Не будет ли это расточительно с точки зрения расхода памяти, когда будет открываться и закрываться курсор. Или все таки правильнее вначале чекать на наличие каких либо строк, а потом только запускать объявление курсора, открытие и т.д. Насколько открытие - закрытие пустого курсора ресурсоемкий процесс? Можно этим пренебречь?
13 май 15, 08:27    [17632019]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли открываться курсор если набор не вернет ни одной строчки  [new]
Glory
Member

Откуда:
Сообщений: 104751
abort
Насколько открытие - закрытие пустого курсора ресурсоемкий процесс?

Курсоры бывают разные. И те которые весь набор выбирают при открытии, и те, которые вообще ничего не выбирают при открытии
А писать нужно тот код, который оптимально решает конкретную задачу
13 май 15, 08:38    [17632036]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли открываться курсор если набор не вернет ни одной строчки  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21253
abort
Если набор данных не вернет ни одной строчки, курсор будет открываться или нет
Чтобы понять, что набор данных пуст, курсор должен быть открыт, и выполнена заложенная в него выборка. Или ты полагаешь, что сервер сперва выполнит запрос, подвесив его в пустоте, и будет смотреть, вернулись ли записи, чтобы решить, формировать ли для него курсор или, и так сойдет...
13 май 15, 08:58    [17632082]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли открываться курсор если набор не вернет ни одной строчки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
abort,
1. а почему он не должен открыться?
2. Может быть Вам пересмотреть код и отказаться от курсора?
13 май 15, 12:10    [17633186]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли открываться курсор если набор не вернет ни одной строчки  [new]
abort
Member

Откуда:
Сообщений: 625
понятно, что он только после открытия курсора определяет наличие записи. И по любому он открывается. Надеялся, что до открытия происходит проверка на наличие данных. Спс. Вопрос закрыт
13 май 15, 12:16    [17633222]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить