TSQL изменить определение курсора - PullRequest
10 голосов
/ 01 марта 2011

Я использую курсор.

DECLARE @column1 NVARCHAR(MAX);

DECLARE cursor_name CURSOR FOR
    SELECT c1
    FROM   table_name;

OPEN cursor_name;
FETCH cursor_name INTO @column1;

WHILE @@FETCH_STATUS = 0
BEGIN

    FETCH cursor_name INTO @column1;
END

CLOSE cursor_name;
DEALLOCATE cursor_name;

Теперь мой вопрос, могу ли я изменить определение курсора cursor_name после его использования? Я имею в виду что-то похожее на:

DECLARE cursor_name CURSOR FOR
    SELECT c2
    FROM   table_name2;

Использование того же имени курсора cursor_name, но определение изменилось. Если это возможно, как это сделать?

Спасибо.

Ответы [ 3 ]

11 голосов
/ 01 марта 2011

Да, это возможно , но это должно быть после того, как вы ДЕЛАКЛИРУЕТЕ его.Вы пробовали это, и оно не работает или что-то в этом роде?

Вы также можете посмотреть, действительно ли вам нужен курсор.Они снижают производительность, и использующий их SQL часто можно переписать без них.

Взгляните на эту статью , в которой рассказывается, как это сделать.Они используют менее распространенный синтаксис DECLARE / SET для объявления курсора (по крайней мере, редкость в моем мире).Вот пример, который они предоставляют:

USE pubs
GO
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles

DEALLOCATE @MyCursor

SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM sales
GO
4 голосов
/ 01 марта 2011

Избегая обсуждения необходимости или отсутствия необходимости в курсоре, с чисто технической точки зрения, после того, как курсор закрыт и освобожден, вы можете повторно использовать имя.

0 голосов
/ 23 сентября 2015

Исправление к вводящим в заблуждение комментариям о производительности курсора от Abe Miessler:

Курсоры Transact-SQL чрезвычайно эффективны, если они содержатся в хранимых процедурах и триггерах.Это связано с тем, что все скомпилировано в один план выполнения на сервере, и сетевой трафик, связанный с извлечением строк, отсутствует.

Что плохо для производительности, так это неоднократный вызов глобального курсора для следующей строки извне сохраненного процесса.Лучше использовать клиентские функции пакетирования API для этого, чтобы уменьшить количество обращений в БД.

Вы можете использовать курсоры Transact-SQL в приложениях, используя FETCH и связывая каждый столбец, возвращаемый FETCH, с программной переменной.Однако FETCH Transact-SQL не поддерживает пакеты, поэтому это наименее эффективный способ возврата данных в приложение.Выборка каждой строки требует обращения к серверу.Более эффективно использовать функции курсора, встроенные в API базы данных, которые поддерживают выборку пакетов строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...