다음을 통해 공유


행 집합 및 SQL Server 커서

SQL Server는 다음 두 가지 방법으로 결과 집합을 소비자에게 반환합니다.

  • 다음과 같은 기본 결과 집합

    • 오버헤드를 최소화합니다.

    • 데이터 인출 시 최대 성능을 제공합니다.

    • 정방향 전용, 읽기 전용 기본 커서 기능만 지원합니다.

    • 한 번에 한 행씩 소비자에게 행을 반환합니다.

    • 연결에서 한 번에 하나의 활성 문만 지원합니다.

      문이 실행된 후 소비자가 모든 결과를 검색하거나 문이 취소될 때까지 해당 연결에서 다른 문을 실행할 수 없습니다.

    • 모든 Transact-SQL 문을 지원합니다.

  • 다음과 같은 서버 커서

    • 모든 커서 기능을 지원합니다.

    • 소비자에게 행 블록을 반환할 수 있습니다.

    • 단일 연결에서 여러 개의 활성 문을 지원합니다.

    • 커서 기능과 성능의 균형을 조정합니다.

      커서 기능을 지원하면 기본 결과 집합과 비교해서 성능이 저하될 수 있습니다. 소비자가 커서 기능을 사용하여 더 작은 행 집합을 검색할 수 있는 경우 이러한 성능 저하를 상쇄할 수 있습니다.

    • 결과 집합을 두 개 이상 반환하는 Transact-SQL 문을 지원하지 않습니다.

소비자는 특정 행 집합 속성을 설정하여 행 집합에 다른 커서 동작을 요청할 수 있습니다. 소비자가 이러한 행 집합 속성 중 하나를 설정하지 않거나 모두 해당 기본값으로 설정하면 SQL Server Native Client OLE DB 공급자는 기본 결과 집합을 사용하여 행 집합을 구현합니다. 이러한 속성 중 하나라도 기본값이 아닌 값으로 설정하면 SQL Server Native Client OLE DB 공급자는 서버 커서를 사용하여 행 집합을 구현합니다.

다음과 같은 행 집합 속성을 사용하면 SQL Server Native Client OLE DB 공급자는 SQL Server 커서를 사용합니다. 일부 속성은 다른 속성과 안전하게 조합할 수 있습니다. 예를 들어 DBPROP_IRowsetScroll 및 DBPROP_IRowsetChange 속성을 나타내는 행 집합은 즉시 업데이트 동작을 표시하는 책갈피 행 집합이 됩니다. 다른 속성은 함께 사용할 수 없습니다. 예를 들어 DBPROP_OTHERINSERT를 나타내는 행 집합은 책갈피를 포함할 수 없습니다.

속성 ID

행 집합 동작

DBPROP_SERVERCURSOR

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 순차적이며 정방향으로만 스크롤하거나 인출할 수 있습니다. 상대적인 행 위치 지정은 지원됩니다. 명령 텍스트에는 ORDER BY 절이 포함될 수 있습니다.

DBPROP_CANSCROLLBACKWARDS 또는 DBPROP_CANFETCHBACKWARDS

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 어느 방향으로든 스크롤하거나 인출할 수 있습니다. 상대적인 행 위치 지정은 지원됩니다. 명령 텍스트에는 ORDER BY 절이 포함될 수 있습니다.

DBPROP_BOOKMARKS 또는 DBPROP_LITERALBOOKMARKS

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 순차적이며 정방향으로만 스크롤하거나 인출할 수 있습니다. 상대적인 행 위치 지정은 지원됩니다. 명령 텍스트에는 ORDER BY 절이 포함될 수 있습니다.

DBPROP_OWNUPDATEDELETE, DBPROP_OWNINSERT 또는 DBPROP_OTHERUPDATEDELETE

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 어느 방향으로든 스크롤하거나 인출할 수 있습니다. 상대적인 행 위치 지정은 지원됩니다. 명령 텍스트에는 ORDER BY 절이 포함될 수 있습니다.

DBPROP_OTHERINSERT

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 어느 방향으로든 스크롤하거나 인출할 수 있습니다. 상대적인 행 위치 지정은 지원됩니다. 참조된 열에 인덱스가 있으면 명령 텍스트에 ORDER BY 절이 포함될 수 있습니다.

행 집합에 책갈피가 포함되어 있으면 DBPROP_OTHERINSERT는 VARIANT_TRUE일 수 없습니다. 이 표시 유형 속성과 책갈피를 사용하여 행 집합을 만들려고 하면 오류가 발생합니다.

DBPROP_IRowsetLocate 또는 DBPROP_IRowsetScroll

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 어느 방향으로든 스크롤하거나 인출할 수 있습니다. IRowsetLocate 인터페이스를 통한 책갈피 및 절대 위치 지정이 행 집합에서 지원됩니다. 명령 텍스트에는 ORDER BY 절이 포함될 수 있습니다.

DBPROP_IRowsetLocate 및 DBPROP_IRowsetScroll은 행 집합에 책갈피가 필요합니다. VARIANT_TRUE로 설정된 DBPROP_OTHERINSERT와 책갈피를 사용하여 행 집합을 만들려고 하면 오류가 발생합니다.

DBPROP_IRowsetChange 또는 DBPROP_IRowsetUpdate

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 있습니다. 행 집합은 순차적이며 정방향으로만 스크롤하거나 인출할 수 있습니다. 상대적인 행 위치 지정은 지원됩니다. 업데이트 가능한 커서를 지원하는 모든 명령은 이러한 인터페이스를 지원할 수 있습니다.

DBPROP_IRowsetLocate 또는 DBPROP_IRowsetScroll 및 DBPROP_IRowsetChange 또는 DBPROP_IRowsetUpdate

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 있습니다. 행 집합은 어느 방향으로든 스크롤하거나 인출할 수 있습니다. IRowsetLocate를 통한 책갈피 및 절대 위치 지정이 행 집합에서 지원됩니다. 명령 텍스트에는 ORDER BY 절이 포함될 수 있습니다.

DBPROP_IMMOBILEROWS

VARIANT_FALSE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 정방향 스크롤만 지원합니다. 상대적인 행 위치 지정은 지원됩니다. 참조된 열에 인덱스가 있으면 명령 텍스트에 ORDER BY 절이 포함될 수 있습니다.

DBPROP_IMMOBILEROWS는 다른 세션의 명령이나 다른 사용자에 의해 삽입된 SQL Server 행을 표시할 수 있는 행 집합에서만 사용할 수 있습니다. DBPROP_OTHERINSERT가 VARIANT_TRUE일 수 없는 행 집합에서 속성이 VARIANT_FALSE로 설정된 행 집합을 열려고 하면 오류가 발생합니다.

DBPROP_REMOVEDELETED

VARIANT_TRUE

행 집합을 통해 SQL Server 데이터를 업데이트할 수 없습니다. 행 집합은 정방향 스크롤만 지원합니다. 상대적인 행 위치 지정은 지원됩니다. 다른 속성으로 제한되지 않은 경우 명령 텍스트에 ORDER BY 절이 포함될 수 있습니다.

IOpenRowset::OpenRowset 메서드를 사용하면 SQL Server 기본 테이블이나 뷰에서 서버 커서가 지원하는 SQL Server Native Client OLE DB 공급자 행 집합을 쉽게 만들 수 있습니다. rgPropertySets 매개 변수에 필요한 행 집합 속성 세트를 전달하여 이름으로 테이블이나 뷰를 지정합니다.

행 집합이 서버 커서에서 지원되도록 소비자가 요구하는 경우 행 집합을 만드는 명령 텍스트가 제한됩니다. 구체적으로, 명령 텍스트는 단일 행 집합 결과를 반환하는 단일 SELECT 문이나 단일 행 집합 결과를 반환하는 단일 SELECT 문을 구현하는 저장 프로시저로 제한됩니다.

두 테이블에서는 다양한 OLE DB 속성과 커서 모델의 매핑을 보여 줍니다. 또한 특정 유형의 커서 모델을 사용하도록 설정해야 하는 행 집합 속성을 표시합니다.

테이블의 각 셀에는 특정 커서 모델에 대한 행 집합 속성 값이 포함됩니다. 이 항목의 앞부분에 표시된 모든 행 집합 속성의 데이터 형식은 VT_BOOL이고 기본값은 VARIANT_FALSE입니다. 표에서 사용되는 기호는 다음과 같습니다.

F = 기본값(VARIANT_FALSE)

T = VARIANT_TRUE

- = VARIANT_TRUE 또는 VARIANT_FALSE

특정 유형의 커서 모델을 사용하려면 커서 모델에 해당하는 열을 찾아 열에 값 'T'가 포함된 행 집합 속성을 모두 찾습니다. 특정 커서 모델을 사용하려면 이러한 행 집합 속성을 VARIANT_TRUE로 설정합니다. 값이 '-'인 행 집합 속성은 VARIANT_TRUE 또는 VARIANT_FALSE로 설정할 수 있습니다.

행 집합 속성/커서 모델

기본

결과

집합

(RO)

빠른

정방향

전용

(RO)

정적

(RO)

집합

(RO)

DBPROP_SERVERCURSOR

F

T

T

T

DBPROP_DEFERRED

F

F

-

-

DBPROP_IrowsetChange

F

F

F

F

DBPROP_IrowsetLocate

F

F

-

-

DBPROP_IrowsetScroll

F

F

-

-

DBPROP_IrowsetUpdate

F

F

F

F

DBPROP_BOOKMARKS

F

F

-

-

DBPROP_CANFETCHBACKWARDS

F

F

-

-

DBPROP_CANSRCOLLBACKWARDS

F

F

-

-

DBPROP_CANHOLDROWS

F

F

-

-

DBPROP_LITERALBOOKMARKS

F

F

-

-

DBPROP_OTHERINSERT

F

T

F

F

DBPROP_OTHERUPDATEDELETE

F

T

F

T

DBPROP_OWNINSERT

F

T

F

T

DBPROP_OWNUPDATEDELETE

F

T

F

T

DBPROP_QUICKSTART

F

F

-

-

DBPROP_REMOVEDELETED

F

F

F

-

DBPROP_IrowsetResynch

F

F

F

-

DBPROP_CHANGEINSERTEDROWS

F

F

F

F

DBPROP_SERVERDATAONINSERT

F

F

F

-

DBPROP_UNIQUEROWS

-

F

F

F

DBPROP_IMMOBILEROWS

-

-

-

T

행 집합 속성/커서 모델

동적(RO)

키 집합(R/W)

동적(R/W)

DBPROP_SERVERCURSOR

T

T

T

DBPROP_DEFERRED

-

-

-

DBPROP_IrowsetChange

F

-

-

DBPROP_IrowsetLocate

F

-

F

DBPROP_IrowsetScroll

F

-

F

DBPROP_IrowsetUpdate

F

-

-

DBPROP_BOOKMARKS

F

-

F

DBPROP_CANFETCHBACKWARDS

-

-

-

DBPROP_CANSRCOLLBACKWARDS

-

-

-

DBPROP_CANHOLDROWS

F

-

F

DBPROP_LITERALBOOKMARKS

F

-

F

DBPROP_OTHERINSERT

T

F

T

DBPROP_OTHERUPDATEDELETE

T

T

T

DBPROP_OWNINSERT

T

T

T

DBPROP_OWNUPDATEDELETE

T

T

T

DBPROP_QUICKSTART

-

-

-

DBPROP_REMOVEDELETED

T

-

T

DBPROP_IrowsetResynch

-

-

-

DBPROP_CHANGEINSERTEDROWS

F

-

F

DBPROP_SERVERDATAONINSERT

F

-

F

DBPROP_UNIQUEROWS

F

F

F

DBPROP_IMMOBILEROWS

F

T

F

특정 행 집합 속성 집합의 경우 선택되는 커서 모델은 다음과 같이 결정됩니다.

지정한 행 집합 속성 컬렉션에서 앞의 표에 나열된 속성의 하위 집합을 가져옵니다. 각 행 집합 속성의 플래그 값(필수(T, F) 또는 옵션(-))에 따라 이러한 속성을 두 개의 하위 그룹으로 나눕니다. 각 커서 모델에 대해 첫 번째 표에서 시작하여 왼쪽에서 오른쪽으로 이동합니다. 두 하위 그룹의 속성 값을 이 열의 해당 속성 값과 비교합니다. 필수 속성과 불일치하는 항목이 없고 옵션 속성과 불일치하는 항목 수가 최소인 커서 모델이 선택됩니다. 커서 모델이 두 개 이상 있으면 가장 왼쪽의 항목이 선택됩니다.

SQL Server 커서 블록 크기

SQL Server 커서가 SQL Server Native Client OLE DB 공급자 행 집합을 지원하는 경우 IRowset::GetNextRows 또는 IRowsetLocate::GetRowsAt 메서드의 행 핸들 배열 매개 변수에 있는 요소 수에 따라 커서 블록 크기가 결정됩니다. 배열의 핸들로 표시된 행이 커서 블록의 멤버입니다.

책갈피를 지원하는 행 집합의 경우 IRowsetLocate::GetRowsByBookmark 메서드를 사용하여 검색된 행 핸들이 커서 블록의 멤버를 정의합니다.

행 집합을 채우고 SQL Server 커서 블록을 형성하는 데 사용된 메서드에 관계없이 커서 블록은 행 집합에 대해 다음 행 인출 메서드를 실행할 때까지 활성화되어 있습니다.