DEALLOCATE(Transact-SQL)

커서 참조를 제거합니다. 마지막 커서 참조가 할당 해제될 경우 MicrosoftSQL Server에서 커서를 구성하는 데이터 구조가 해제됩니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

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

인수

  • cursor_name
    이미 선언된 커서의 이름입니다. 동일한 cursor_name을 가진 전역 커서와 지역 커서가 있을 경우 GLOBAL이 지정되면 cursor_name은 전역 커서를 참조하고 GLOBAL이 지정되지 않으면 지역 커서를 참조합니다.

  • @cursor_variable_name
    cursor 변수의 이름입니다. @cursor_variable_namecursor 형식이어야 합니다.

주의

커서에서 실행되는 문은 커서 이름이나 커서 변수를 사용하여 커서를 참조합니다. 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