DEALLOCATE (Transact-SQL)

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure ДаУправляемый экземпляр SQL Azure

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

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

Синтаксис

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

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

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

@cursor_variable_name
Имя переменной курсора.Переменная @cursor_variable_name должна иметь тип cursor.

Комментарии

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

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

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

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

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

  • С помощью имени, используя инструкцию 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)