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


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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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