- 2017 년 3 월 14 일
- 읽는 데 13 분
-
- c
- r
- i
- M
- m
-
+6
적용 대상 : SQL Server (지원되는 모든 버전 ) Azure SQL Database
스크롤 동작 및 결과 집합을 빌드하는 데 사용되는 쿼리와 같은 Transact-SQL 서버 커서의 특성을 정의합니다. 커서가 작동합니다. DECLARE CURSOR
는 ISO 표준에 기반한 구문과 일련의 Transact-SQL 확장을 사용하는 구문을 모두 허용합니다.
Transact-SQL 구문 규칙
구문
참고
SQL Server 2014 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하십시오. .
인수
cursor_name
정의 된 Transact-SQL 서버 커서의 이름입니다. cursor_name은 식별자 규칙을 따라야합니다.
INSENSITIVE
커서가 사용할 데이터의 임시 복사본을 만드는 커서를 정의합니다. 커서에 대한 모든 요청은 tempdb의이 임시 테이블에서 응답합니다. 따라서 기본 테이블에 대한 수정 사항은이 커서에 대한 페치에 의해 반환 된 데이터에 반영되지 않으며이 커서는 수정을 허용하지 않습니다. ISO 구문을 사용할 때 INSENSITIVE
를 생략하면 모든 사용자가 기본 테이블에 대한 커밋 된 삭제 및 업데이트가 후속 가져 오기에 반영됩니다.
SCROLL
모든 가져 오기 옵션 (FIRST
, LAST
, PRIOR
, NEXT
, RELATIVE
, ABSOLUTE
)를 사용할 수 있습니다. SCROLL
가 ISO DECLARE CURSOR
에 지정되지 않은 경우 NEXT
가 지원되는 유일한 가져 오기 옵션입니다. . FAST_FORWARD
도 지정된 경우 SCROLL
를 지정할 수 없습니다. SCROLL
를 지정하지 않으면 가져 오기 옵션 NEXT
만 사용할 수 있으며 커서는 FORWARD_ONLY
.
select_statement
커서의 결과 집합을 정의하는 표준 SELECT
문입니다. FOR BROWSE
및 INTO
키워드는 커서 선언의 select_statement 내에서 허용되지 않습니다.
SQL Server는 select_statement의 절이 요청 된 커서 유형의 기능과 충돌하는 경우 커서를 다른 유형으로 전환합니다.
읽기 전용
이 커서를 통한 업데이트를 방지합니다. UPDATE
또는 DELETE
문의 WHERE CURRENT OF
절에서 커서를 참조 할 수 없습니다. 이 옵션은 업데이트 할 커서의 기본 기능을 재정의합니다.
cursor_name
정의 된 Transact-SQL 서버 커서의 이름입니다. cursor_name은 식별자 규칙을 따라야합니다.
LOCAL
커서의 범위가 커서가 생성 된 배치, 저장 프로 시저 또는 트리거에 대해 로컬임을 지정합니다. 커서 이름은이 범위 내에서만 유효합니다. 커서는 일괄 처리, 저장 프로 시저 또는 트리거의 로컬 커서 변수 또는 저장 프로 시저 OUTPUT
매개 변수에서 참조 할 수 있습니다. OUTPUT
매개 변수는 로컬 커서를 호출 배치, 저장 프로 시저 또는 트리거로 다시 전달하는 데 사용됩니다.이 매개 변수는 저장 프로 시저 이후 커서를 참조하도록 커서 변수에 매개 변수를 할당 할 수 있습니다. 종료됩니다. 커서가 OUTPUT
매개 변수에서 다시 전달되지 않는 한, 커서는 배치, 저장 프로 시저 또는 트리거가 종료 될 때 암시 적으로 할당 해제됩니다. OUTPUT
매개 변수로 다시 전달되면 커서를 참조하는 마지막 변수가 할당 해제되거나 범위를 벗어날 때 커서가 할당 해제됩니다.
GLOBAL
커서의 범위가 연결에 대해 전역임을 지정합니다. 커서 이름은 연결에 의해 실행되는 모든 저장 프로 시저 또는 일괄 처리에서 참조 될 수 있습니다. 커서는 연결 해제시에만 암시 적으로 할당 해제됩니다.
참고
GLOBAL
또는 LOCAL
가 지정되고 기본값은 로컬 커서 데이터베이스 옵션에 대한 기본값 설정에 의해 제어됩니다.
FORWARD_ONLY
커서가 앞으로 이동하고 다음에서 스크롤 할 수만 있음을 지정합니다. 첫 번째 행부터 마지막 행까지. FETCH NEXT
는 유일하게 지원되는 가져 오기 옵션입니다. 결과 집합의 행에 영향을주는 현재 사용자 (또는 다른 사용자가 커밋)가 만든 모든 삽입, 업데이트 및 삭제 문은 행을 가져올 때 표시됩니다.그러나 커서를 뒤로 스크롤 할 수 없기 때문에 행을 가져온 후 데이터베이스의 행에 대한 변경 사항은 커서를 통해 볼 수 없습니다. 정방향 전용 커서는 기본적으로 동적입니다. 즉, 현재 행이 처리 될 때 모든 변경 사항이 감지됩니다. 이렇게하면 커서가 더 빨리 열리고 결과 집합이 기본 테이블에 대한 업데이트를 표시 할 수 있습니다. 정방향 전용 커서는 역방향 스크롤을 지원하지 않지만 응용 프로그램은 커서를 닫았다가 다시 열면 결과 집합의 시작 부분으로 돌아갈 수 있습니다. FORWARD_ONLY
가 , KEYSET
또는 DYNAMIC
키워드 인 경우 커서는 동적 커서로 작동합니다. FORWARD_ONLY
와 SCROLL
가 모두 지정되지 않은 경우 FORWARD_ONLY
가 기본값입니다. div id = “faf4e501b3”> , KEYSET
또는 DYNAMIC
가 지정되었습니다. STATIC
, KEYSET
및 DYNAMIC
커서의 기본값은 SCROLL
. ODBC 및 ADO와 같은 데이터베이스 API와 달리 FORWARD_ONLY
는 STATIC
, KEYSET
에서 지원됩니다. 및 DYNAMIC
Transact-SQL 커서
STATIC
커서가 처음 열렸을 때의 결과 집합을 항상 표시하도록 지정하고 커서가 사용할 데이터의 임시 사본. 커서에 대한 모든 요청은 tempdb의이 임시 테이블에서 응답합니다. 따라서 기본 테이블에 대한 삽입, 업데이트 및 삭제는이 커서에 대한 페치에 의해 리턴 된 데이터에 반영되지 않으며이 커서는 커서가 열린 후 결과 세트의 멤버십, 순서 또는 값에 대한 변경 사항을 감지하지 않습니다. . 정적 커서는 필요한 것은 아니지만 자체 업데이트, 삭제 및 삽입을 감지 할 수 있습니다. 예를 들어 정적 커서가 행을 가져오고 다른 애플리케이션이 해당 행을 업데이트한다고 가정합니다. 애플리케이션이 정적 커서에서 행을 다시 페치하는 경우 다른 애플리케이션에서 변경 한 내용에도 불구하고 표시되는 값은 변경되지 않습니다. 모든 유형의 스크롤이 지원됩니다.
KEYSET
커서가 열릴 때 커서의 구성원 및 행 순서가 고정되도록 지정합니다. 행을 고유하게 식별하는 키 세트는 키 세트라고하는 tempdb의 테이블에 빌드됩니다. 이 커서는 변경 사항을 감지하는 기능에서 정적 커서와 동적 커서 사이의 기능을 제공합니다. 정적 커서와 마찬가지로 결과 집합의 구성원 및 순서에 대한 변경 사항을 항상 감지하지는 않습니다. 동적 커서처럼 결과 집합의 행 값에 대한 변경 사항을 감지합니다. 키 집합 기반 커서는 키 집합으로 알려진 고유 식별자 (키) 집합에 의해 제어됩니다. 키는 결과 집합의 행을 고유하게 식별하는 열 집합에서 작성됩니다. 키 집합은 쿼리 문에서 반환 한 모든 행의 키 값 집합입니다. 키 세트 구동 커서를 사용하면 커서의 각 행에 대해 키가 빌드되고 저장되며 클라이언트 워크 스테이션이나 서버에 저장됩니다. 각 행에 액세스 할 때 저장된 키는 데이터 소스에서 현재 데이터 값을 가져 오는 데 사용됩니다. 키 집합 기반 커서에서 키 집합이 완전히 채워지면 결과 집합 구성원이 고정됩니다. 그 후, 멤버십에 영향을 미치는 추가 또는 업데이트는 다시 열릴 때까지 결과 집합의 일부가 아닙니다. 사용자가 결과 집합을 스크롤 할 때 데이터 값 (키 집합 소유자 또는 다른 프로세스에 의해 수행됨)에 대한 변경 사항이 표시됩니다.
- 행이 삭제 된 경우 행을 가져 오려고하면 삭제 된 행이 결과 집합에 공백으로 나타나기 때문에 -2의
@@FETCH_STATUS
가 반환됩니다. 행의 키는 키 세트에 있지만 행은 더 이상 결과 세트에 존재하지 않습니다. - 커서 외부 (다른 프로세스에 의해) 삽입은 커서가 닫히고 다시 열린 경우에만 표시됩니다. 커서 내부에서 삽입 한 내용은 결과 집합의 끝에 표시됩니다.
- 커서 외부에서 키 값을 업데이트하면 이전 행을 삭제 한 다음 새 행을 삽입하는 것과 비슷합니다. 새 값이있는 행은 표시되지 않으며 이전 값이있는 행을 가져 오려고하면
@@FETCH_STATUS
-2가 반환됩니다.WHERE CURRENT OF
절을 지정하여 커서를 통해 업데이트를 수행하면 새 값이 표시됩니다.
참고
쿼리가 고유 색인이없는 하나 이상의 테이블을 참조하는 경우 키 집합 커서는 정적 커서로 변환됩니다.
DYNAMIC
에 대한 모든 데이터 변경 사항을 반영하는 커서를 정의합니다. 커서 내부에서 변경이 발생하는지 또는 커서 외부의 다른 사용자에 의해 발생하는지에 관계없이 커서를 스크롤하고 새 레코드를 가져올 때 결과 세트의 행. 따라서 모든 사용자가 작성한 모든 삽입, 업데이트 및 삭제 문은 커서를 통해 볼 수 있습니다.행의 데이터 값, 순서 및 멤버십은 각 페치에서 변경 될 수 있습니다. ABSOLUTE
가져 오기 옵션은 동적 커서에서 지원되지 않습니다. 커서 외부에서 수행 된 업데이트는 커밋 될 때까지 표시되지 않습니다 (커서 트랜잭션 격리 수준이 UNCOMMITTED
로 설정되지 않은 경우). 예를 들어 동적 커서가 두 개의 행과 다른 응용 프로그램을 가져 온다고 가정합니다. 해당 행 중 하나를 업데이트하고 다른 행을 삭제합니다. 그런 다음 동적 커서가 해당 행을 가져 오면 삭제 된 행을 찾지 못하지만 업데이트 된 행에 대한 새 값이 표시됩니다.
FAST_FORWARD
FORWARD_ONLY
, READ_ONLY
커서. SCROLL
또는 FOR_UPDATE
도 지정된 경우 FAST_FORWARD
를 지정할 수 없습니다. 이 유형의 커서는 커서 내부에서 데이터 수정을 허용하지 않습니다.
참고
FAST_FORWARD
및 FORWARD_ONLY
는 동일한 DECLARE CURSOR
문에서 사용할 수 있습니다.
READ_ONLY
이 커서를 통한 업데이트를 방지합니다. UPDATE
또는 DELETE
문의 WHERE CURRENT OF
절에서 커서를 참조 할 수 없습니다. 이 옵션은 업데이트 할 커서의 기본 기능을 재정의합니다.
SCROLL_LOCKS
커서를 통한 위치 지정 업데이트 또는 삭제가 성공하도록 지정합니다. SQL Server는 나중에 수정할 수 있도록 행을 커서로 읽을 때 행을 잠급니다. FAST_FORWARD
또는 STATIC
도 지정된 경우 SCROLL_LOCKS
를 지정할 수 없습니다.
OPTIMISTIC
행이 커서로 읽혀진 이후에 갱신 된 경우 커서를 통한 위치 지정된 갱신 또는 삭제가 성공하지 못하도록 지정합니다. SQL Server는 커서로 읽어 들일 때 행을 잠그지 않습니다. 대신 타임 스탬프 열 값 또는 테이블에 타임 스탬프 열이없는 경우 체크섬 값의 비교를 사용하여 행을 커서로 읽은 후 수정되었는지 여부를 확인합니다. 행이 수정 된 경우 시도 된 위치 지정 업데이트 또는 삭제가 실패합니다. FAST_FORWARD
도 지정된 경우 OPTIMISTIC
를 지정할 수 없습니다.
TYPE_WARNING
경고 메시지가 전송되도록 지정합니다. 커서가 요청 된 유형에서 다른 유형으로 암시 적으로 변환 될 때 클라이언트에 전달됩니다.
select_statement
커서의 결과 집합을 정의하는 표준 SELECT 문입니다. 키워드 COMPUTE
, COMPUTE BY
, FOR BROWSE
및 INTO
는 커서 선언의 select_statement 내에서 허용되지 않습니다.
참고
커서 선언 내에서 쿼리 힌트를 사용할 수 있습니다. 그러나 FOR UPDATE OF
절도 사용하는 경우 FOR UPDATE OF
뒤에 OPTION (<query_hint>)
를 지정하세요.
p>
SQL Server는 select_statement의 절이 요청 된 커서 유형의 기능과 충돌하는 경우 커서를 다른 유형으로 암시 적으로 변환합니다. 자세한 내용은 암시 적 커서 변환을 참조하세요.
설명
DECLARE CURSOR
는 Transact-SQL 서버 커서의 속성을 정의합니다. 스크롤 동작 및 커서가 작동하는 결과 집합을 빌드하는 데 사용되는 쿼리. OPEN
문은 결과 집합을 채우고 FETCH
는 결과 집합에서 행을 반환합니다. CLOSE
문은 커서와 관련된 현재 결과 집합을 해제합니다. DEALLOCATE
문은 커서가 사용하는 리소스를 해제합니다.
DECLARE CURSOR
문의 첫 번째 형식은 ISO를 사용합니다. 커서 동작을 선언하는 구문. 두 번째 형식의 DECLARE CURSOR
는 ODBC 또는 ADO의 데이터베이스 API 커서 함수에 사용 된 것과 동일한 커서 유형을 사용하여 커서를 정의 할 수있는 Transact-SQL 확장을 사용합니다.
두 가지 형태를 혼합 할 수 없습니다. CURSOR
키워드 앞에 SCROLL
또는 INSENSITIVE
키워드를 지정하면 CURSOR
및 FOR <select_statement>
키워드 사이의 키워드 CURSOR
및 FOR <select_statement>
키워드 사이에 키워드를 지정하는 경우 SCROLL
를 지정할 수 없습니다. INSENSITIVE
는 CURSOR
키워드 앞입니다.
Transact-SQL 구문을 사용하는 DECLARE CURSOR
가 READ_ONLY
, OPTIMISTIC
또는 SCROLL_LOCKS
의 기본값은 다음과 같습니다.
-
SELECT
문은 업데이트를 지원하지 않습니다 (권한 부족, 업데이트를 지원하지 않는 원격 테이블 액세스 등). 커서는READ_ONLY
입니다. -
STATIC
및FAST_FORWARD
커서의 기본값은READ_ONLY
입니다. -
DYNAMIC
및KEYSET
커서의 기본값은OPTIMISTIC
입니다. .
커서 이름은 다른 Transact-SQL 문에서만 참조 할 수 있습니다. 데이터베이스 API 함수에서 참조 할 수 없습니다. 예를 들어 커서를 선언 한 후에는 OLE DB, ODBC 또는 ADO 함수 나 메서드에서 커서 이름을 참조 할 수 없습니다. API의 페치 함수 또는 메소드를 사용하여 커서 행을 페치 할 수 없습니다. 행은 Transact-SQL FETCH 문으로 만 가져올 수 있습니다.
커서가 선언 된 후 이러한 시스템 저장 프로 시저를 사용하여 커서의 특성을 확인할 수 있습니다.
시스템 저장 프로 시저 | 설명 |
---|---|
sp_cursor_list | 연결 및 해당 속성에 현재 보이는 커서 목록을 반환합니다. |
sp_describe_cursor | 정방향 전용인지 스크롤 커서인지와 같은 커서의 속성을 설명합니다. |
sp_describe_cursor_columns | 커서 결과 집합에있는 열의 특성을 설명합니다. |
sp_describe_cursor_tables | 액세스 된 기본 테이블을 설명합니다. 커서로. |
변수는 다음을 선언하는 select_statement의 일부로 사용될 수 있습니다. 커서. 커서 변수 값은 커서가 선언 된 후에도 변경되지 않습니다.
권한
DECLARE CURSOR
의 권한은 기본적으로
커서에 사용 된 뷰, 테이블 및 열에 대한 권한.
제한 사항 및 제한 사항
다음과 같은 테이블에서 커서 또는 트리거를 사용할 수 없습니다. 클러스터형 columnstore 인덱스 이 제한은 클러스터되지 않은 columnstore 인덱스에는 적용되지 않습니다. 비 클러스터형 columnstore 인덱스가있는 테이블에서 커서와 트리거를 사용할 수 있습니다.
예
A. 간단한 커서 및 구문 사용
이 커서를 열 때 생성 된 결과 집합에는 테이블의 모든 행과 모든 열이 포함됩니다. 이 커서는 업데이트 될 수 있으며 모든 업데이트 및 삭제는이 커서에 대한 페치로 표시됩니다. FETCH NEXT
는 SCROLL
옵션이 지정되지 않았기 때문에 사용 가능한 유일한 가져 오기입니다.
B. 중첩 된 커서를 사용하여 보고서 출력 생성
다음 예는 커서를 중첩하여 복잡한 보고서를 생성하는 방법을 보여줍니다. 내부 커서는 각 공급 업체에 대해 선언됩니다.