DECLARE CURSOR(Transact-SQL)DECLARE CURSOR (Transact-SQL)

적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database

스크롤 동작, 커서가 작동하는 결과 집합을 구축하는 데 사용되는 쿼리 등 Transact-SQLTransact-SQL 서버 커서의 특성을 정의합니다.Defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. DECLARE CURSOR는 ISO 표준 기반의 구문과 Transact-SQLTransact-SQL 확장 세트를 사용하는 구문을 모두 허용합니다.DECLARE CURSOR accepts both a syntax based on the ISO standard and a syntax using a set of Transact-SQLTransact-SQL extensions.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

ISO Syntax  
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR   
     FOR select_statement   
     [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]  
[;]  
Transact-SQL Extended Syntax  
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]   
     [ FORWARD_ONLY | SCROLL ]   
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]   
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]   
     [ TYPE_WARNING ]   
     FOR select_statement   
     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]  
[;]  

참고

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

인수Arguments

cursor_namecursor_name
정의된 Transact-SQLTransact-SQL 서버 커서의 이름입니다.Is the name of the Transact-SQLTransact-SQL server cursor defined. cursor_name은 식별자에 대한 규칙을 따라야 합니다.cursor_name must conform to the rules for identifiers.

INSENSITIVEINSENSITIVE
커서에서 사용할 데이터를 임시로 복사해 주는 커서를 정의합니다.Defines a cursor that makes a temporary copy of the data to be used by the cursor. 커서에 대한 모든 요청은 tempdb의 임시 테이블에서 응답하므로 기본 테이블에 대한 수정 내용은 해당 커서에 대한 인출에서 반환된 데이터에는 반영되지 않으며 이 커서는 수정을 허용하지 않습니다.All requests to the cursor are answered from this temporary table in tempdb; therefore, modifications made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not allow modifications. ISO 구문을 사용할 때 INSENSITIVE를 생략하면 사용자가 기본 테이블에 커밋한 삭제 및 업데이트 내용이 후속 인출에 반영됩니다.When ISO syntax is used, if INSENSITIVE is omitted, committed deletes and updates made to the underlying tables (by any user) are reflected in subsequent fetches.

SCROLLSCROLL
모든 인출 옵션(FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE)을 사용할 수 있도록 지정합니다.Specifies that all fetch options (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) are available. ISO DECLARE CURSOR에서 SCROLL을 지정하지 않으면 NEXT 인출 옵션만 지원됩니다.If SCROLL is not specified in an ISO DECLARE CURSOR, NEXT is the only fetch option supported. FAST_FORWARD까지 지정한 경우 SCROLL을 지정할 수 없습니다.SCROLL cannot be specified if FAST_FORWARD is also specified. SCROLL이 지정되지 않으면 페치 옵션 NEXT만 사용할 수 있고 커서는 FORWARD_ONLY가 됩니다.If SCROLL is not specified then only the fetch option NEXT is available and the cursor becomes FORWARD_ONLY.

select_statementselect_statement
커서의 결과 세트를 정의하는 표준 SELECT 문입니다.Is a standard SELECT statement that defines the result set of the cursor. FOR BROWSEINTO 키워드는 커서 선언의 select_statement 내에서 허용되지 않습니다.The keywords FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

SQL ServerSQL Serverselect_statement의 절이 요청된 커서 유형의 기능과 충돌할 경우 커서를 다른 유형으로 암시적으로 변환합니다.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type.

READ ONLYREAD ONLY
이 커서를 통한 업데이트를 방지합니다.Prevents updates made through this cursor. UPDATE 또는 DELETE 문의 WHERE CURRENT OF 절에서 커서를 참조할 수 없습니다.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. 이 옵션은 업데이트할 커서의 기본 기능을 무시합니다.This option overrides the default capability of a cursor to be updated.

UPDATE [OF column_name [,...n]]UPDATE [OF column_name [,...n]]
커서 내에서 업데이트할 수 있는 열을 정의합니다.Defines updatable columns within the cursor. OF <column_name> [, <... n>]이 지정된 경우 나열된 열만 수정이 가능합니다.If OF <column_name> [, <... n>] is specified, only the columns listed allow modifications. 열 목록 없이 UPDATE를 지정하면 모든 열을 업데이트할 수 있습니다.If UPDATE is specified without a column list, all columns can be updated.

cursor_namecursor_name
정의된 Transact-SQLTransact-SQL 서버 커서의 이름입니다.Is the name of the Transact-SQLTransact-SQL server cursor defined. cursor_name은 식별자에 대한 규칙을 따라야 합니다.cursor_name must conform to the rules for identifiers.

LOCALLOCAL
커서 범위를 커서가 생성된 일괄 처리, 저장 프로시저, 트리거에 대해 로컬로 지정합니다.Specifies that the scope of the cursor is local to the batch, stored procedure, or trigger in which the cursor was created. 커서 이름은 지정된 범위 내에서만 유효합니다.The cursor name is only valid within this scope. 일괄 처리, 저장 프로시저, 트리거의 로컬 커서 변수 또는 저장 프로시저의 OUTPUT 매개 변수에서 커서를 참조할 수 있습니다.The cursor can be referenced by local cursor variables in the batch, stored procedure, or trigger, or a stored procedure OUTPUT parameter. OUTPUT 매개 변수는 호출한 일괄 처리, 저장 프로시저, 트리거로 로컬 커서를 다시 전달하는 데 사용되며 저장 프로시저가 종료된 후 커서 변수에 매개 변수를 할당하여 커서를 참조할 수 있습니다.An OUTPUT parameter is used to pass the local cursor back to the calling batch, stored procedure, or trigger, which can assign the parameter to a cursor variable to reference the cursor after the stored procedure terminates. 커서가 OUTPUT 매개 변수에서 다시 전달되지 않은 경우 일괄 처리나 저장 프로시저, 트리거가 종료되면 커서가 암시적으로 할당 취소됩니다.The cursor is implicitly deallocated when the batch, stored procedure, or trigger terminates, unless the cursor was passed back in an OUTPUT parameter. OUTPUT 매개 변수에서 커서가 다시 전달되면 커서를 참조하는 마지막 변수의 할당이 취소되거나 범위를 벗어날 때 커서의 할당이 취소됩니다.If it is passed back in an OUTPUT parameter, the cursor is deallocated when the last variable referencing it is deallocated or goes out of scope.

GLOBALGLOBAL
커서 범위를 연결에 대해 전역으로 지정합니다.Specifies that the scope of the cursor is global to the connection. 연결되어 실행하는 모든 저장 프로시저 또는 일괄 처리에서 커서 이름을 참조할 수 있습니다.The cursor name can be referenced in any stored procedure or batch executed by the connection. 커서는 연결 해제 시에만 암시적으로 할당이 취소됩니다.The cursor is only implicitly deallocated at disconnect.

참고

GLOBAL 또는 LOCAL 중 하나도 지정하지 않으면 기본값은 default to local cursor 데이터베이스 옵션의 설정에 따라 결정됩니다.If neither GLOBAL or LOCAL is specified, the default is controlled by the setting of the default to local cursor database option.

FORWARD_ONLYFORWARD_ONLY
커서가 앞으로만 이동하고 첫 번째 행에서 마지막 행까지 스크롤할 수 있도록 지정합니다.Specifies that the cursor can only move forward and be scrolled from the first to the last row. 유일하게 지원되는 인출 옵션은 FETCH NEXT입니다.FETCH NEXT is the only supported fetch option. 현재 사용자가 만들거나 다른 사용자가 커밋하여 결과 집합의 행에 영향을 주는 모든 삽입, 업데이트 및 삭제 문은 행을 페치할 때 볼 수 있습니다.All insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. 그러나 커서는 뒤로 스크롤할 수 없기 때문에 행이 페치된 후 데이터베이스 행의 변경 내용은 대부분 커서를 통해 볼 수 없습니다.Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor. 정방향 전용 커서는 기본적으로 동적이며, 이는 현재 행이 처리될 때 모든 변경 내용이 감지됨을 의미합니다.Forward-only cursors are dynamic by default, meaning that all changes are detected as the current row is processed. 이렇게 하면 커서가 더 빨리 열리고 결과 집합이 기본 테이블에 대한 업데이트를 표시하도록 설정할 수 있습니다.This provides faster cursor opening and enables the result set to display updates made to the underlying tables. 정방향 전용 커서는 역방향 스크롤을 지원하지 않지만 애플리케이션은 커서를 닫았다가 다시 열면 결과 집합의 시작 부분으로 돌아갈 수 있습니다.While forward-only cursors do not support backward scrolling, applications can return to the beginning of the result set by closing and reopening the cursor. STATIC, KEYSET 또는 DYNAMIC 키워드를 사용하지 않고 FORWARD_ONLY를 지정하면 커서는 동적 커서로 작동합니다.If FORWARD_ONLY is specified without the STATIC, KEYSET, or DYNAMIC keywords, the cursor operates as a dynamic cursor. FORWARD_ONLY 또는 SCROLL 중 하나도 지정하지 않으면 STATIC, KEYSET 또는 DYNAMIC 키워드를 지정하지 않는 이상 기본값은 FORWARD_ONLY입니다.When neither FORWARD_ONLY nor SCROLL is specified, FORWARD_ONLY is the default, unless the keywords STATIC, KEYSET, or DYNAMIC are specified. STATIC, KEYSETDYNAMIC 커서는 기본적으로 SCROLL입니다.STATIC, KEYSET, and DYNAMIC cursors default to SCROLL. ODBC, ADO 등의 데이터베이스 API와는 달리, FORWARD_ONLYSTATIC, KEYSETDYNAMIC Transact-SQLTransact-SQL 커서에서 지원됩니다.Unlike database APIs such as ODBC and ADO, FORWARD_ONLY is supported with STATIC, KEYSET, and DYNAMIC Transact-SQLTransact-SQL cursors.

STATICSTATIC
커서가 처음 열릴 때와 같은 결과 집합을 항상 표시하고 커서가 사용할 데이터의 임시 복사본을 만들도록 지정합니다.Specifies that the cursor always displays the result set as it was when the cursor was first opened, and makes a temporary copy of the data to be used by the cursor. 커서에 대한 모든 요청은 tempdb의 이 임시 테이블에서 응답됩니다.All requests to the cursor are answered from this temporary table in tempdb. 따라서 기본 테이블에 대한 삽입, 업데이트 및 삭제는 이 커서로 만들어진 페치에 의해 반환되는 데이터에 반영되지 않으며, 이 커서는 커서가 열린 후에 결과 집합의 멤버 자격, 순서 또는 값에 대한 변경 내용을 검색하지 못합니다.Therefore inserts, updates, and deletes made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not detect changes made to the membership, order, or values of the result set after the cursor is opened. 정적 커서는 자체 업데이트, 삭제 및 삽입을 검색할 수 있지만 필수 사항은 아닙니다.Static cursors may detect their own updates, deletes, and inserts, although they are not required to do so. 예를 들어 정적 커서가 행을 페치하고 다른 애플리케이션이 해당 행을 업데이트한다고 가정합니다.For example, suppose a static cursor fetches a row, and another application then updates that row. 애플리케이션이 정적 커서에서 행을 다시 페치하면 다른 애플리케이션에서 변경한 내용에도 불구하고 표시되는 값은 변경되지 않습니다.If the application refetches the row from the static cursor, the values it sees are unchanged, despite the changes made by the other application. 모든 유형의 스크롤이 지원됩니다.All types of scrolling are supported.

KEYSETKEYSET
커서가 열릴 때 커서에 있는 행의 멤버 자격과 순서가 고정되도록 지정합니다.Specifies that the membership and order of rows in the cursor are fixed when the cursor is opened. 행을 고유하게 식별하는 keyset이라는 키 집합이 tempdb의 테이블에 생성됩니다.The set of keys that uniquely identify the rows is built into a table in tempdb known as the keyset. 이 커서는 정적 커서와 동적 커서 간에 변경 내용을 검색하는 기능을 제공합니다.This cursor provides functionality between a static and a dynamic cursor in its ability to detect changes. 정적 커서처럼 항상 결과 집합의 멤버 자격과 순서에 대한 변경 내용을 검색하지는 못합니다.Like a static cursor, it does not always detect changes to the membership and order of the result set. 동적 커서처럼 결과 집합의 행 값에 대한 변경 내용을 검색합니다.Like a dynamic cursor, it does detect changes to the values of rows in the result set. 키 집합 커서는 키 집합이라는 고유 식별자(키) 집합으로 제어됩니다.Keyset-driven cursors are controlled by a set of unique identifiers (keys) known as the keyset. 키는 결과 집합에서 행을 고유하게 식별하는 열 집합으로 작성됩니다.The keys are built from a set of columns that uniquely identify the rows in the result set. 키 집합은 쿼리 문에서 반환된 모든 행의 키 값 집합입니다.The keyset is the set of key values from all the rows returned by the query statement. 키 집합 커서를 사용하여 커서의 각 행에 대해 키를 빌드 및 저장하고 클라이언트 워크스테이션 또는 서버에 저장합니다.With keyset-driven cursors, a key is built and saved for each row in the cursor and stored either on the client workstation or on the server. 각 행에 액세스하면 저장된 키를 사용하여 데이터 원본에서 현재 데이터 값을 페치합니다.When you access each row, the stored key is used to fetch the current data values from the data source. 키 집합 커서에서 키 집합이 완전히 채워지면 결과 집합 멤버 자격이 고정됩니다.In a keyset-driven cursor, result set membership is frozen when the keyset is fully populated. 이후 멤버 자격에 영향을 주는 추가 또는 업데이트는 다시 열 때까지 결과 집합의 일부가 아닙니다.Thereafter, additions or updates that affect membership are not a part of the result set until it is reopened. 사용자가 결과 집합을 스크롤할 때 데이터 값(키 집합 소유자 또는 다른 프로세스에 의해 생성됨)에 대한 변경 내용이 나타납니다.Changes to data values (made either by the keyset owner or other processes) are visible as the user scrolls through the result set:

  • 행이 삭제되면 삭제된 행이 결과 집합의 간격으로 표시되므로 행을 페치하려고 하면 -2의 @@FETCH_STATUS가 반환됩니다.If a row is deleted, an attempt to fetch the row returns an @@FETCH_STATUS of -2 because the deleted row appears as a gap in the result set. 행의 키는 키 집합에 있지만 행은 결과 집합에 더 이상 존재하지 않습니다.The key for the row exists in the keyset, but the row no longer exists in the result set.
  • 커서 외부에서 수행한 삽입은(다른 프로세스에 의해)은 커서를 닫았다가 다시 열 때만 볼 수 있습니다.Inserts made outside the cursor (by other processes) are visible only if the cursor is closed and reopened. 커서 내에서 수행한 삽입은 결과 집합의 끝에 표시됩니다.Inserts made from inside the cursor are visible at the end of the result set.
  • 커서 외부에서 키 값을 업데이트하는 것은 이전 행을 삭제하고 새 행을 삽입하는 것과 비슷합니다.Updates of key values from outside the cursor resemble a delete of the old row followed by an insert of the new row. 새 값을 가진 행을 볼 수 없으므로 이전 값을 가진 행을 인출하려고 하면 -2의 @@FETCH_STATUS로 반환됩니다.The row with the new values is not visible, and attempts to fetch the row with the old values return an @@FETCH_STATUS of -2. WHERE CURRENT OF 절을 지정하여 커서를 통해 업데이트를 수행한 경우에는 새 값을 볼 수 있습니다.The new values are visible if the update is done through the cursor by specifying the WHERE CURRENT OF clause.

참고

쿼리가 고유 인덱스 없이 한 개 이상의 테이블을 참조하는 경우 키 집합 커서는 정적 커서로 변환됩니다.If the query references at least one table without a unique index, the keyset cursor is converted to a static cursor.

DYNAMICDYNAMIC
커서 내부 또는 커서 외부의 다른 사용자가 변경했는지에 관계없이 커서를 스크롤하고 새 코드를 가져올 때 결과 집합의 행에 대해 수행된 모든 데이터 변경 내용을 반영하는 커서를 정의합니다.Defines a cursor that reflects all data changes made to the rows in its result set as you scroll around the cursor and fetch a new record, regardless of whether the changes occur from inside the cursor or by other users outside the cursor. 따라서 모든 사용자가 실행한 모든 삽입, 업데이트 및 삭제 문은 커서를 통해 볼 수 있습니다.Therefore all insert, update, and delete statements made by all users are visible through the cursor. 따라서 인출할 때마다 행의 데이터 값, 순서 및 멤버 자격이 변경될 수 있습니다.The data values, order, and membership of the rows can change on each fetch. 동적 커서에서는 ABSOLUTE 페치 옵션이 지원되지 않습니다.The ABSOLUTE fetch option is not supported with dynamic cursors. 커서 외부에서 수행된 업데이트는 커밋될 때까지 볼 수 없습니다(커서 트랜잭션 격리 수준이 UNCOMMITTED로 설정되어 있지 않은 경우).Updates made outside the cursor are not visible until they are committed (unless the cursor transaction isolation level is set to UNCOMMITTED). 예를 들어 동적 커서가 두 행을 페치하고 다른 애플리케이션이 해당 행 중 하나를 업데이트하고 다른 행을 삭제한다고 가정합니다.For example, suppose a dynamic cursor fetches two rows and another application then updates one of those rows and deletes the other. 그런 다음, 동적 커서가 해당 행을 페치하는 경우, 삭제된 행을 찾을 수 없지만 업데이트된 행에 대한 새 값을 표시합니다.If the dynamic cursor then fetches those rows, it will not find the deleted row, but it will display the new values for the updated row.

FAST_FORWARDFAST_FORWARD
성능 최적화가 설정된 FORWARD_ONLY, READ_ONLY 커서를 지정합니다.Specifies a FORWARD_ONLY, READ_ONLY cursor with performance optimizations enabled. SCROLL 또는 FOR_UPDATE까지 지정한 경우 FAST_FORWARD을 지정할 수 없습니다.FAST_FORWARD cannot be specified if SCROLL or FOR_UPDATE is also specified. 이 유형의 커서는 커서 내부에서 데이터 수정을 허용하지 않습니다.This type of cursor does not allow data modifications from inside the cursor.

참고

FAST_FORWARDFORWARD_ONLY를 같은 DECLARE CURSOR 문에 사용할 수 있습니다.Both FAST_FORWARD and FORWARD_ONLY can be used in the same DECLARE CURSOR statement.

READ_ONLYREAD_ONLY
이 커서를 통한 업데이트를 방지합니다.Prevents updates made through this cursor. UPDATE 또는 DELETE 문의 WHERE CURRENT OF 절에서 커서를 참조할 수 없습니다.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. 이 옵션은 업데이트할 커서의 기본 기능을 무시합니다.This option overrides the default capability of a cursor to be updated.

SCROLL_LOCKSSCROLL_LOCKS
커서를 통해 현재 위치 업데이트 또는 삭제가 반드시 실행되도록 지정합니다.Specifies that positioned updates or deletes made through the cursor are guaranteed to succeed. SQL ServerSQL Server는 커서에서 읽어 들이는 행을 잠가 나중에 수정할 때 사용할 수 있도록 합니다.locks the rows as they are read into the cursor to ensure their availability for later modifications. FAST_FORWARD 또는 STATIC까지 지정한 경우 SCROLL_LOCKS을 지정할 수 없습니다.SCROLL_LOCKS cannot be specified if FAST_FORWARD or STATIC is also specified.

OPTIMISTICOPTIMISTIC
커서에서 읽어 들인 행이 업데이트된 경우 커서를 통해 지정된 위치에서 업데이트 또는 삭제가 실행되지 않도록 지정합니다.Specifies that positioned updates or deletes made through the cursor do not succeed if the row has been updated since it was read into the cursor. 이 경우 SQL ServerSQL Server는 커서로 행을 읽을 때 행을 잠그지 않습니다.SQL ServerSQL Server does not lock rows as they are read into the cursor. 대신 timestamp 열 값을 비교하거나 테이블에 timestamp 열이 없을 경우 체크섬 값을 비교하여 커서로 읽은 행이 수정되었는지 여부를 확인합니다.It instead uses comparisons of timestamp column values, or a checksum value if the table has no timestamp column, to determine whether the row was modified after it was read into the cursor. 행이 수정된 경우 지정된 위치에서 업데이트나 삭제가 실행되지 않습니다.If the row was modified, the attempted positioned update or delete fails. FAST_FORWARD까지 지정한 경우 OPTIMISTIC을 지정할 수 없습니다.OPTIMISTIC cannot be specified if FAST_FORWARD is also specified.

TYPE_WARNINGTYPE_WARNING
요청한 커서 형식이 다른 형식으로 암시적으로 변환된 경우 클라이언트에게 경고 메시지를 보내도록 지정합니다.Specifies that a warning message is sent to the client when the cursor is implicitly converted from the requested type to another.

select_statementselect_statement
커서의 결과 집합을 정의하는 표준 SELECT 문입니다.Is a standard SELECT statement that defines the result set of the cursor. COMPUTE, COMPUTE BY, FOR BROWSEINTO 키워드는 커서 선언의 select_statement 내에서 허용되지 않습니다.The keywords COMPUTE, COMPUTE BY, FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

참고

커서 선언 내에 쿼리 힌트를 사용할 수 있습니다. 그러나 OPTION (<query_hint>) 절도 함께 사용하는 경우 FOR UPDATE OF 뒤에 FOR UPDATE OF를 지정하세요.You can use a query hint within a cursor declaration; however, if you also use the FOR UPDATE OF clause, specify OPTION (<query_hint>) after FOR UPDATE OF.

SQL ServerSQL Serverselect_statement의 절이 요청된 커서 유형의 기능과 충돌할 경우 커서를 다른 유형으로 암시적으로 변환합니다.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type. 자세한 내용은 암시적 커서 변환을 참조하세요.For more information, see Implicit Cursor Conversions.

FOR UPDATE [OF column_name [,...n]]FOR UPDATE [OF column_name [,...n]]
커서 내에서 업데이트할 수 있는 열을 정의합니다.Defines updatable columns within the cursor. OF <column_name> [, <... n>]이 제공된 경우 나열된 열만 수정이 가능합니다.If OF <column_name> [, <... n>] is supplied, only the columns listed allow modifications. READ_ONLY 동시성 옵션이 지정되지 않은 경우 열 목록 없이 UPDATE를 지정하면 모든 열을 업데이트할 수 있습니다.If UPDATE is specified without a column list, all columns can be updated, unless the READ_ONLY concurrency option was specified.

설명Remarks

DECLARE CURSOR는 스크롤 동작, 커서가 작동하는 결과 세트를 구축하는 데 사용되는 쿼리 등 Transact-SQLTransact-SQL 서버 커서의 특성을 정의합니다.DECLARE CURSOR defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. OPEN 문은 결과 세트를 채우고 FETCH는 결과 세트에서 행을 반환합니다.The OPEN statement populates the result set, and FETCH returns a row from the result set. CLOSE 문은 커서와 연결된 현재 결과 세트를 해제합니다.The CLOSE statement releases the current result set associated with the cursor. DEALLOCATE 문은 커서에서 사용된 리소스를 해제합니다.The DEALLOCATE statement releases the resources used by the cursor.

DECLARE CURSOR 문의 첫 번째 형식은 커서 동작을 선언하기 위해 ISO 구문을 사용합니다.The first form of the DECLARE CURSOR statement uses the ISO syntax for declaring cursor behaviors. DECLARE CURSOR 문의 두 번째 형식은 ODBC 또는 ADO의 데이터베이스 API 커서 함수에서 사용된 것과 동일한 커서 형식을 사용하여 커서를 정의할 수 있는 Transact-SQLTransact-SQL 확장을 사용합니다.The second form of DECLARE CURSOR uses Transact-SQLTransact-SQL extensions that allow you to define cursors using the same cursor types used in the database API cursor functions of ODBC or ADO.

위의 두 가지 형식을 함께 사용할 수는 없습니다.You cannot mix the two forms. CURSOR 키워드 앞에 SCROLL 또는 INSENSITIVE 키워드를 지정하면 CURSORFOR <select_statement> 키워드 사이에 어떤 키워드도 사용할 수 없습니다.If you specify the SCROLL or INSENSITIVE keywords before the CURSOR keyword, you cannot use any keywords between the CURSOR and FOR <select_statement> keywords. CURSORFOR <select_statement> 키워드 사이에 키워드를 지정하면 CURSOR 키워드 앞에 SCROLL 또는 INSENSITIVE를 지정할 수 없습니다.If you specify any keywords between the CURSOR and FOR <select_statement> keywords, you cannot specify SCROLL or INSENSITIVE before the CURSOR keyword.

Transact-SQLTransact-SQL 구문을 사용하는 DECLARE CURSORREAD_ONLY, OPTIMISTIC,또는 SCROLL_LOCKS를 지정하지 않으면 기본값은 다음과 같습니다.If a DECLARE CURSOR using Transact-SQLTransact-SQL syntax does not specify READ_ONLY, OPTIMISTIC, or SCROLL_LOCKS, the default is as follows:

  • 권한 부족, 업데이트를 지원하지 않는 원격 테이블 액세스 등의 이유로 SELECT 문이 업데이트를 지원하지 않을 경우 커서는 READ_ONLY가 됩니다.If the SELECT statement does not support updates (insufficient permissions, accessing remote tables that do not support updates, and so on), the cursor is READ_ONLY.

  • STATICFAST_FORWARD 커서는 기본적으로 READ_ONLY입니다.STATIC and FAST_FORWARD cursors default to READ_ONLY.

  • DYNAMICKEYSET 커서는 기본적으로 OPTIMISTIC입니다.DYNAMIC and KEYSET cursors default to OPTIMISTIC.

커서 이름은 다른 Transact-SQLTransact-SQL 문에서만 참조될 수 있으며Cursor names can be referenced only by other Transact-SQLTransact-SQL statements. 데이터베이스 API 함수에서는 참조될 수 없습니다.They cannot be referenced by database API functions. 예를 들어, 커서를 선언한 후 OLE DB, ODBC, ADO 함수나 메서드에서 커서 이름을 참조할 수 없습니다.For example, after declaring a cursor, the cursor name cannot be referenced from OLE DB, ODBC or ADO functions or methods. 커서 행은 API의 인출 함수나 메서드를 사용하여 인출할 수 없고 Transact-SQLTransact-SQL의 FETCH 문을 사용해야만 인출할 수 있습니다.The cursor rows cannot be fetched using the fetch functions or methods of the APIs; the rows can be fetched only by Transact-SQLTransact-SQL FETCH statements.

커서를 선언한 후 다음 시스템 저장 프로시저를 사용하여 커서의 특징을 확인할 수 있습니다.After a cursor has been declared, these system stored procedures can be used to determine the characteristics of the cursor.

시스템 저장 프로시저System stored procedures DescriptionDescription
sp_cursor_listsp_cursor_list 현재 연결에서 볼 수 있는 커서 목록과 그 특성을 반환합니다.Returns a list of cursors currently visible on the connection and their attributes.
sp_describe_cursorsp_describe_cursor 정방향 전용 커서, 스크롤 커서 등의 커서 특성을 설명합니다.Describes the attributes of a cursor, such as whether it is a forward-only or scrolling cursor.
sp_describe_cursor_columnssp_describe_cursor_columns 커서 결과 집합에서 열의 특성을 설명합니다.Describes the attributes of the columns in the cursor result set.
sp_describe_cursor_tablessp_describe_cursor_tables 커서에 의해 액세스되는 기본 테이블을 설명합니다.Describes the base tables accessed by the cursor.

변수는 커서를 선언하는 select_statement의 일부로 사용될 수 있습니다.Variables may be used as part of the select_statement that declares a cursor. 커서가 선언된 후에는 커서 변수 값이 변경되지 않습니다.Cursor variable values do not change after a cursor is declared.

사용 권한Permissions

DECLARE CURSOR 권한은 커서에 사용된 보기, 테이블, 열에 대한 SELECT 권한이 있는 모든 사용자에게 기본적으로 부여됩니다.Permissions of DECLARE CURSOR default to any user that has SELECT permissions on the views, tables, and columns used in the cursor.

제한 사항Limitations and Restrictions

클러스터형 columnstore 인덱스가 있는 테이블에서는 커서 또는 트리거를 사용할 수 없습니다.You cannot use cursors or triggers on a table with a clustered columnstore index. 비클러스터형 columnstore 인덱스에는 이러한 제한이 적용되지 않습니다. 즉 비클러스터형 columnstore 인덱스가 있는 테이블에서는 커서 및 트리거를 사용할 수 있습니다.This restriction does not apply to nonclustered columnstore indexes; you can use cursors and triggers on a table with a nonclustered columnstore index.

예제Examples

A.A. 단순 커서 및 구문 사용Using simple cursor and syntax

다음 커서를 열 때 생성된 결과 집합에는 테이블에 있는 모든 행과 모든 열이 포함됩니다.The result set generated at the opening of this cursor includes all rows and all columns in the table. 이 커서는 업데이트가 가능하며 이 커서에 대해 수행한 인출에는 모든 업데이트와 삭제 내용이 나타납니다.This cursor can be updated, and all updates and deletes are represented in fetches made against this cursor. FETCH NEXT 옵션을 지정하지 않았으므로 SCROLL 인출만 사용할 수 있습니다.FETCH NEXT is the only fetch available because the SCROLL option has not been specified.

DECLARE vend_cursor CURSOR  
    FOR SELECT * FROM Purchasing.Vendor  
OPEN vend_cursor  
FETCH NEXT FROM vend_cursor;  

B.B. 중첩된 커서를 사용하여 보고서 출력 생성Using nested cursors to produce report output

다음 예에서는 커서를 중첩시켜 복잡한 보고서를 생성하는 방법을 보여 줍니다.The following example shows how cursors can be nested to produce complex reports. 각 공급업체에 대해 내부 커서가 선언됩니다.The inner cursor is declared for each vendor.

SET NOCOUNT ON;  
  
DECLARE @vendor_id INT, @vendor_name NVARCHAR(50),  
    @message VARCHAR(80), @product NVARCHAR(50);  
  
PRINT '-------- Vendor Products Report --------';  
  
DECLARE vendor_cursor CURSOR FOR   
SELECT VendorID, Name  
FROM Purchasing.Vendor  
WHERE PreferredVendorStatus = 1  
ORDER BY VendorID;  
  
OPEN vendor_cursor  
  
FETCH NEXT FROM vendor_cursor   
INTO @vendor_id, @vendor_name  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  
    PRINT ' '  
    SELECT @message = '----- Products From Vendor: ' +   
        @vendor_name  
  
    PRINT @message  
  
    -- Declare an inner cursor based     
    -- on vendor_id from the outer cursor.  
  
    DECLARE product_cursor CURSOR FOR   
    SELECT v.Name  
    FROM Purchasing.ProductVendor pv, Production.Product v  
    WHERE pv.ProductID = v.ProductID AND  
    pv.VendorID = @vendor_id  -- Variable value from the outer cursor  
  
    OPEN product_cursor  
    FETCH NEXT FROM product_cursor INTO @product  
  
    IF @@FETCH_STATUS <> 0   
        PRINT '         <<None>>'       
  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
  
        SELECT @message = '         ' + @product  
        PRINT @message  
        FETCH NEXT FROM product_cursor INTO @product  
        END  
  
    CLOSE product_cursor  
    DEALLOCATE product_cursor  
        -- Get the next vendor.  
    FETCH NEXT FROM vendor_cursor   
    INTO @vendor_id, @vendor_name  
END   
CLOSE vendor_cursor;  
DEALLOCATE vendor_cursor;  

참고 항목See Also

@@FETCH_STATUS&#40;Transact-SQL&#41; @@FETCH_STATUS (Transact-SQL)
CLOSE (Transact-SQL) CLOSE (Transact-SQL)
커서(Transact-SQL) Cursors (Transact-SQL)
DEALLOCATE (Transact-SQL) DEALLOCATE (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
SELECT(Transact-SQL) SELECT (Transact-SQL)
sp_configure (Transact-SQL)sp_configure (Transact-SQL)