Поделиться через


DEALLOCATE (Transact-SQL)

Удаляет ссылку курсора. Когда удаляется последняя ссылка курсора, Microsoft SQL Server освобождает структуры данных, составляющие курсор.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }

Аргументы

  • cursor_name
    Имя объявленного курсора. Если существуют как глобальный, так и локальный курсоры с именем cursor_name, имя cursor_name указывает глобальный курсор, если указано ключевое слово GLOBAL, и локальный курсор, если не указано.

  • @cursor\_variable\_name
    Имя переменной cursor. Аргумент @cursor\_variable\_name должен иметь тип cursor.

Замечания

Инструкции, обрабатывающие курсоры, используют для ссылки имя курсора или имя переменной курсора. Инструкция DEALLOCATE удаляет связь между курсором и его именем или переменной. Если это последнее имя или переменная, ссылающаяся на курсор, сам курсор удаляется и освобождаются все используемые им ресурсы. DEALLOCATE освобождает все блокировки прокрутки, которые используются для защиты изоляции выборки. Блокировки транзакций, которые используются для защиты обновлений, включая позиционные обновления в курсоре, удерживаются до завершения транзакции.

Инструкция DECLARE CURSOR присваивает курсору имя и связывает его с этим именем.

DECLARE abc SCROLL CURSOR FOR
SELECT * FROM Person.Person;

После того как имя курсора связано с курсором, это имя нельзя использовать для другого курсора той же области действия (GLOBAL или LOCAL), пока этот курсор не будет освобожден.

Переменная курсора связывается с курсором двумя способами.

  • С помощью имени, используя инструкцию SET, которая устанавливает курсору переменную курсора.

    DECLARE @MyCrsrRef CURSOR
    SET @MyCrsrRef = abc
    
  • Курсор можно также создать и связать с переменной, не определяя имя курсора.

    DECLARE @MyCursor CURSOR
    SET @MyCursor = CURSOR LOCAL SCROLL FOR
    SELECT * FROM Person.Person;
    

Инструкция DEALLOCATE @cursor\_variable\_name удаляет только ссылку именованной переменной на курсор. Эта переменная не освобождается, пока не выходит за область действия в конце пакета, хранимой процедуры или триггера. После выполнения инструкции DEALLOCATE @cursor\_variable\_name эту переменную можно связать с другим курсором, используя инструкцию SET.

USE AdventureWorks2012;
GO

DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM Sales.SalesPerson;

DEALLOCATE @MyCursor;

SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM Sales.SalesTerritory;
GO

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

Разрешения

По умолчанию разрешения DEALLOCATE предоставляются всем допустимым пользователям.

Примеры

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

USE AdventureWorks2012;
GO
-- Create and open a global named cursor that
-- is visible outside the batch.
DECLARE abc CURSOR GLOBAL SCROLL FOR
SELECT * FROM Sales.SalesPerson;
OPEN abc;
GO
-- Reference the named cursor with a cursor variable.
DECLARE @MyCrsrRef1 CURSOR;
SET @MyCrsrRef1 = abc;
-- Now deallocate the cursor reference.
DEALLOCATE @MyCrsrRef1;
-- Cursor abc still exists.
FETCH NEXT FROM abc;
GO
-- Reference the named cursor again.
DECLARE @MyCrsrRef2 CURSOR;
SET @MyCrsrRef2 = abc;
-- Now deallocate cursor name abc.
DEALLOCATE abc;
-- Cursor still exists, referenced by @MyCrsrRef2.
FETCH NEXT FROM @MyCrsrRef2;
-- Cursor finally is deallocated when last referencing
-- variable goes out of scope at the end of the batch.
GO
-- Create an unnamed cursor.
DECLARE @MyCursor CURSOR;
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM Sales.SalesTerritory;
-- The following statement deallocates the cursor
-- because no other variables reference it.
DEALLOCATE @MyCursor;
GO

См. также

Справочник

CLOSE (Transact-SQL)

DECLARE @local\_variable (Transact-SQL)

FETCH (Transact-SQL)

OPEN (Transact-SQL)

Основные понятия

Курсоры