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


DEALLOCATE (Transact-SQL)

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

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

Синтаксис

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

Аргументы

  • cursor_name
    Имя объявленного курсора. Когда имеется как глобальный, так и локальный курсор с именем cursor_name, то cursor_name относится к глобальному курсору, если задано GLOBAL, и к локальному, если GLOBAL не задано.
  • @cursor_variable_name
    Имя переменной cursor. Аргумент @cursor_variable_name должно иметь тип cursor.

Замечания

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

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

DECLARE abc SCROLL CURSOR FOR
SELECT * FROM Person.Contact

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

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

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

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

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

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

USE AdventureWorks
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 AdventureWorks
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)

Другие ресурсы

Курсоры (ядро СУБД)

Справка и поддержка

Получение помощи по SQL Server 2005