IMultipleResults를 사용하여 SQL Server Native Client에서 여러 결과 집합 처리
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
소비자는 IMultipleResults 인터페이스를 사용하여 SQL Server Native Client OLE DB 공급자 명령 실행에서 반환된 결과를 처리합니다. SQL Server Native Client OLE DB 공급자가 실행을 위한 명령을 제출하면 SQL Server는 문을 실행하고 결과를 반환합니다.
클라이언트는 명령 실행의 모든 결과를 처리해야 합니다. SQL Server Native Client OLE DB 공급자 명령 실행은 여러 행 집합 개체를 결과로 생성할 수 있으므로 IMultipleResults 인터페이스를 사용하여 애플리케이션 데이터 검색이 클라이언트 시작 왕복을 완료하도록 합니다.
다음 Transact-SQL 문은 여러 행 집합을 생성합니다. 이 중에는 OrderDetails 테이블의 행 데이터 집합도 있고, COMPUTE BY 절의 결과 집합도 있습니다.
SELECT OrderID, FullPrice = (UnitPrice * Quantity), Discount,
Discounted = UnitPrice * (1 - Discount) * Quantity
FROM OrderDetails
ORDER BY OrderID
COMPUTE
SUM(UnitPrice * Quantity), SUM(UnitPrice * (1 - Discount) * Quantity)
BY OrderID
소비자가 이 텍스트가 포함된 명령을 실행하고 행 집합을 반환된 결과 인터페이스로 요청하는 경우 첫 번째 행 집합만 반환됩니다. 소비자는 반환된 행 집합의 모든 행을 처리할 수 있습니다. 그러나 DBPROP_MULTIPLECONNECTIONS 데이터 원본 속성이 VARIANT_FALSE 설정되고 MARS가 연결에서 활성화되지 않은 경우 명령이 취소될 때까지 세션 개체에서 다른 명령을 실행할 수 없습니다(SQL Server Native Client OLE DB 공급자는 다른 연결을 만들지 않음). 연결에서 MARS를 사용하지 않는 경우 SQL Server Native Client OLE DB 공급자는 DBPROP_MULTIPLECONNECTIONS VARIANT_FALSE 경우 DB_E_OBJECTOPEN 오류를 반환하고 활성 트랜잭션이 있는 경우 E_FAIL 반환합니다.
SQL Server Native Client OLE DB 공급자는 스트리밍된 출력 매개 변수를 사용할 때도 DB_E_OBJECTOPEN 반환하며, 애플리케이션은 IMultipleResults::GetResults를 호출하여 다음 결과 집합을 가져오기 전에 반환된 출력 매개 변수 값을 모두 사용하지 않았습니다. MARS를 사용하지 않고 연결이 행 집합을 생성하지 않거나 서버 커서가 아닌 행 집합을 생성하는 명령을 실행 중이고 DBPROP_MULTIPLECONNECTIONS 데이터 원본 속성이 VARIANT_TRUE 설정된 경우 SQL Server Native Client OLE DB 공급자는 동시 명령 개체를 지원하기 위해 추가 연결을 만듭니다. 트랜잭션이 활성화되어 있지 않으면 오류가 반환됩니다. 트랜잭션 및 잠금은 연결별로 SQL Server에서 관리됩니다. 두 번째 연결이 생성되면 개별 연결의 명령이 잠금을 공유하지 않습니다. 한 명령이 다른 명령을 차단하지 않도록 다른 명령이 요청한 행의 잠금이 유지되도록 주의해야 합니다. MARS를 사용하는 경우 연결에서 여러 명령을 활성화할 수 있으며 명시적 트랜잭션을 사용하는 경우 명령은 모두 공통 트랜잭션을 공유합니다.
소비자는 ISSAbort::Abort를 사용하거나 명령 개체 및 파생 행 집합에서 유지하는 모든 참조를 해제하는 방식으로 명령을 취소합니다.
모든 인스턴스에서 IMultipleResults를 사용하면 소비자가 명령 실행에 의해 생성된 모든 행 집합을 가져올 수 있으며, 소비자는 명령 실행을 취소하고 다른 명령에서 사용할 세션 개체를 해제할 시기를 적절하게 결정할 수 있습니다.
참고 항목
SQL Server 커서를 사용하는 경우 명령 실행은 커서를 만듭니다. SQL Server는 커서를 만들 때 성공 또는 실패를 반환합니다. 따라서 명령 실행에서 반환되면 SQL Server 인스턴스로의 왕복이 완료됩니다. 그러면 각 GetNextRows 호출이 왕복이 됩니다. 이러한 방식으로 여러 활성 명령 개체가 존재할 수 있으며, 각 개체는 서버 커서에서 페치한 결과인 행 집합을 처리합니다. 자세한 내용은 행 집합 및 SQL Server 커서를 참조 하세요.