API 서버 커서
OLE DB, ODBC 및 ADO API는 실행된 SQL 문의 결과 집합에서 커서 매핑을 지원합니다. MicrosoftSQL Server Native Client OLE DB 공급자와 SQL Server Native Client ODBC 드라이버는 API 서버 커서를 사용하여 이러한 작업을 구현합니다. API 서버 커서는 서버에서 구현되어 API 커서 함수에 의해 관리되는 커서입니다. 응용 프로그램이 API 커서 함수를 호출하면 OLE DB 공급자나 ODBC 드라이버는 커서 작업을 서버로 전송합니다.
OLE DB, ODBC 및 ADO에서 API 서버 커서를 사용할 때는 API 함수나 메서드를 사용하여 다음을 수행합니다.
연결을 엽니다.
각 결과 집합에서 API가 자동으로 매핑하는 커서의 특징을 정의하는 특성 또는 속성을 설정합니다.
하나 이상의 Transact-SQL 문을 실행합니다.
API 함수 또는 메서드를 사용하여 결과 집합의 행을 인출합니다.
API 커서 특성 또는 속성이 해당 기본값으로 설정되면 SQL Server Native Client OLE DB 공급자와 SQL Server Native Client ODBC 드라이버는 기본 결과 집합을 사용합니다. API는 기술적으로 커서를 요청하지만 기본 커서 특징은 기본 결과 집합의 동작과 일치합니다. 따라서 OLE DB 공급자와 ODBC 드라이버는 기본 결과 집합을 사용하여 기본 커서 옵션을 구현합니다. 이것은 서버에서 행을 검색하는 가장 효율적인 방법이기 때문입니다. 기본 결과 집합을 사용하면 응용 프로그램은 모든 Transact-SQL 문이나 일괄 처리를 실행할 수 있지만 처리 중인 문을 연결당 하나만 가질 수 있습니다. 즉, 응용 프로그램은 하나의 문에서 반환된 결과 집합을 모두 처리하거나 취소해야만 해당 연결에 대해 다른 문을 실행할 수 있습니다.
API 커서 특성 또는 속성을 기본값 이외의 값으로 설정하면 SQL Server Native Client OLE DB 공급자 및 SQL Server Native Client ODBC 드라이버는 기본 결과 집합 대신 API 서버 커서를 사용합니다. 행을 인출하는 API 함수를 호출할 때마다 서버 왕복이 생성되어 API 서버 커서로부터 행을 인출합니다.
API 서버 커서 제한 사항
응용 프로그램에서 API 서버 커서를 사용할 때는 다음 문을 실행할 수 없습니다.
SQL Server가 서버 커서에서 지원하지 않는 Transact-SQL 문
여러 결과 집합을 반환하는 일괄 처리 또는 저장 프로시저
COMPUTE, COMPUTE BY, FOR BROWSE 또는 INTO 절을 포함하는 SELECT 문
원격 저장 프로시저를 참조하는 EXECUTE 문
API 서버 커서 구현
SQL Server Native Client OLE DB 공급자 및 SQL Server Native Client ODBC 드라이버는 다음과 같은 특수 시스템 저장 프로시저를 사용하여 서버에 커서 작업 신호를 보냅니다.
sp_cursoropen은 커서 및 커서 옵션과 연관될 SQL 문을 정의한 다음 커서를 채웁니다.
sp_cursorfetch는 커서로부터 행 또는 행 블록을 인출합니다.
sp_cursorclose는 커서를 닫고 할당을 취소합니다.
sp_cursoroption은 다양한 커서 옵션을 설정하는 데 사용됩니다.
sp_cursor는 위치 지정 업데이트를 요청하는 데 사용됩니다.
sp_cursorprepare는 커서와 연관된 Transact-SQL 문이나 일괄 처리를 실행 계획으로 컴파일하지만 커서를 만들지는 않습니다.
sp_cursorexecute는 sp_cursorprepare가 만든 실행 계획에서 커서를 만들고 채웁니다.
sp_cursorunprepare는 sp_cursorprepare에서 실행 계획을 삭제합니다.
sp_cursorprepexec는 커서와 연관되어 제출된 Transact-SQL 문이나 일괄 처리에 대한 실행 계획을 컴파일하며 커서를 만들고 채웁니다. sp_cursorprepexec는 sp_cursorprepare와 sp_cursorexecute의 동작을 결합합니다.
이러한 시스템 저장 프로시저는 API 서버 커서를 사용하는 ADO, OLE DB 및 ODBC 응용 프로그램의 SQL Server 프로파일러 추적에 나타납니다. 이 저장 프로시저는 SQL Server Native Client OLE DB 공급자와 SQL Server Native Client ODBC 드라이버의 내부적 사용만을 위한 것입니다. 이러한 프로시저의 전체 기능은 데이터베이스 API의 커서 기능 사용을 통해서만 응용 프로그램에서 사용할 수 있습니다. 응용 프로그램에서 이 프로시저를 직접 지정할 수는 없습니다.
SQL Server가 연결에 대해 문을 실행할 때는 첫 번째 문의 모든 결과가 처리되거나 취소될 때까지 해당 연결에 대해 다른 문을 실행할 수 없습니다. API 서버 커서를 사용할 때도 이 규칙이 적용되지만 응용 프로그램 관점에서는 SQL Server에서 연결에 대한 여러 활성 문 지원이 시작된 것처럼 보입니다. 그 이유는 전체 결과 집합이 서버 커서에 저장되고 SQL Server로 전달되는 문에 대해서만 sp_cursor 시스템 저장 프로시저가 실행되기 때문입니다. SQL Server는 이 저장 프로시저를 실행하고 클라이언트가 결과 집합을 검색하면 곧바로 다른 문을 실행할 수 있습니다. OLE DB 공급자와 ODBC 드라이버는 항상 sp_cursor 저장 프로시저에서 모든 결과를 검색한 다음 응용 프로그램으로 제어를 반환합니다. 따라서 응용 프로그램 인터리브가 여러 활성 서버 커서에 대해 인출할 수 있습니다.
다음 표에서는 응용 프로그램이 두 가지 문 핸들을 사용하여 연결에 대해 동시에 두 가지 커서를 처리하는 방법을 보여 줍니다.
문 핸들 1 |
문 핸들 2 |
---|---|
API 서버 커서가 사용되도록 커서 특성을 설정합니다. |
|
SQL 문에 대해 SQLExecDirect를 실행합니다. ODBC 드라이버는 sp_cursoropen을 호출하고 프로시저에서 반환한 결과 집합을 검색합니다. |
|
|
API 서버 커서가 사용되도록 커서 특성을 설정합니다. |
|
SQL 문에 대해 SQLExecDirect를 실행합니다. ODBC 드라이버는 sp_cursoropen을 호출하고 프로시저에서 반환한 결과 집합을 검색합니다. |
SQLFetchScroll을 실행하여 첫 번째 행 블록을 검색합니다. 이 드라이버는 sp_cursorfetch를 호출한 다음 프로시저에서 반환한 결과 집합을 검색합니다. |
|
|
SQLFetchScroll을 실행하여 첫 번째 행 블록을 검색합니다. 이 드라이버는 sp_cursorfetch를 호출한 다음 프로시저에서 반환한 결과 집합을 검색합니다. |
SQLFetchScroll을 실행하여 다른 행 블록을 검색합니다. 이 드라이버는 sp_cursorfetch를 호출한 다음 프로시저에서 반환한 결과 집합을 검색합니다. |
|
|
SQLFetchScroll을 실행하여 다른 행 블록을 검색합니다. 이 드라이버는 sp_cursorfetch를 호출한 다음 프로시저에서 반환한 결과 집합을 검색합니다. |
SQLFreeStmt 또는 SQLCloseCursor를 호출합니다. 이 드라이버는 sp_cursorclose를 호출합니다. |
|
|
SQLFreeStmt 또는 SQLCloseCursor를 호출합니다. 이 드라이버는 sp_cursorclose를 호출합니다. |
sp_cursor 저장 프로시저를 호출한 후에는 연결에 처리 중으로 표시되는 결과가 없으므로 모두 API 서버 커서로 실행된 경우에는 단일 연결에 대해 여러 Transact-SQL 문을 동시에 실행할 수 있습니다.
API 서버 커서 지정
다음은 API에서 API 서버 커서를 사용하는 방법에 대한 요약입니다.
OLE DB
세션 개체를 열고 명령 개체를 연 다음 명령 텍스트를 지정합니다.
DBPROP_OTHERINSERT, DBPROP_OTHERUPDATEDELETE, DBPROP_OWNINSERT 및 DBPROP_OWNUDPATEDELETE 등의 행 집합 속성을 설정하여 커서 동작을 제어합니다.
명령 개체를 실행합니다.
IRowset::GetNextRows, IRowsetLocate::GetRowsAt, IRowsetLocate::GetRowsAtBookmark 및 IRowsetScroll::GetRowsAtRatio 등의 메서드를 사용하여 결과 집합에서 행을 인출합니다.
ODBC
연결을 열고 SQLAllocHandle을 호출하여 문 핸들을 할당합니다.
SQLSetStmtAttr을 호출하여 SQL_ATTR_CURSOR_TYPE, SQL_ATTR_CONCURRENCY 및 SQL_ATTR_ROW_ARRAY_SIZE 특성을 설정합니다. 또는 SQL_ATTR_CURSOR_SCROLLABLE 및 SQL_ATTR_CURSOR_SENSITIVITY 특성을 설정하여 커서 동작을 지정할 수 있습니다.
SQLExecDirect 또는 SQLPrepare와 SQLExecute를 사용하여 Transact-SQL 문을 실행합니다.
SQLFetch 또는 SQLFetchScroll을 사용하여 행 또는 행 블록을 인출합니다.
ADO
Connection 개체와 Recordset 개체를 정의한 다음 Connection 개체에 대해 Open 메서드를 실행합니다.
CursorType 및/또는 LockType 매개 변수를 지정하여 Recordset 개체에 대해 Open 메서드를 실행합니다.
Move, MoveFirst, MoveLast, MoveNext 및 MovePrevious 레코드 집합 메서드를 사용하여 행을 인출합니다.
API 서버 커서 및 SET 옵션
SQL Server에서 Fetch 문이 실행되고 계획에 영향을 주는 다음 옵션 또는 인덱싱된 뷰나 계산 열에 필요한 옵션이 변경되면 이 커서는 해당 커서를 열 때 적용되고 있던 옵션 값의 스냅숏을 사용합니다. 이러한 값은 이후의 모든 인출 작업에 사용되고 현재 컨텍스트에서 변경한 내용은 무시됩니다.
계획에 영향을 주는 옵션 |
ARITHABORT NUMERIC_ROUNDABORT FORCEPLAN QUOTED_IDENTIFIER ANSI_NULL_DFLT_ON ANSI_WARNINGS ANSI_PADDING ANSI_NULLS CONCAT_NULL_YIELDS_NULL DATEFIRST DATEFORMAT LANGUAGE TEXTSIZE |
인덱싱된 뷰 및 계산 열 |
ANSI_NULLS ANSI_PADDING ANSI_WARNINGS ARITHABORT(호환성 수준 80 이하) CONCAT_NULL_YIELDS_NULL QUOTED_IDENTIFIER NUMERIC_ROUNDABORT |