결과 처리(ODBC)
응용 프로그램이 SQL 문을 제출하면 SQL Server에서 결과 데이터를 하나 이상의 결과 집합으로 반환합니다. 결과 집합은 쿼리 조건과 일치하는 행과 열 집합입니다. SELECT 문, 카탈로그 함수 및 일부 저장 프로시저는 응용 프로그램에서 사용할 수 있는 결과 집합을 테이블 형식으로 생성합니다. 실행한 SQL 문이 저장 프로시저, 여러 명령이 포함된 일괄 처리 또는 COMPUTE나 COMPUTE BY와 같은 키워드가 포함된 SELECT 문이면 처리할 결과 집합이 여러 개가 됩니다.
또한 ODBC 카탈로그 함수는 데이터를 검색할 수 있습니다. 예를 들어 SQLColumns는 데이터 원본에 있는 열에 대한 데이터를 검색합니다. 이러한 결과 집합에는 0개 이상의 행이 포함될 수 있습니다.
GRANT 또는 REVOKE와 같은 다른 SQL 문은 결과 집합을 반환하지 않습니다. 이러한 문의 경우 대체로 SQLExecute 또는 SQLExecDirect의 반환 코드를 통해서만 문이 성공했음을 확인할 수 있습니다.
각 INSERT, UPDATE 및 DELETE 문은 수정 내용이 적용되는 행 수만 포함된 결과 집합을 반환합니다. 이 개수는 응용 프로그램에서 SQLRowCount를 호출할 때 사용할 수 있습니다. ODBC 3.x 응용 프로그램은 SQLRowCount를 호출하여 결과 집합을 검색하거나 SQLMoreResults를 호출하여 취소합니다. 응용 프로그램이 여러 개의 INSERT, UPDATE 또는 DELETE 문이 포함된 일괄 처리나 저장 프로시저를 실행하는 경우 SQLRowCount를 사용하여 각 수정 문의 결과 집합을 처리하거나 SQLMoreResults를 사용하여 취소해야 합니다. 일괄 처리나 저장 프로시저에 SET NOCOUNT ON 문을 포함하여 이 개수를 취소할 수 있습니다.
Transact-SQL에는 SET NOCOUNT 문이 포함되어 있습니다. NOCOUNT 옵션을 ON으로 설정하면 SQL Server에서 문이 적용되는 행 수를 반환하지 않으며 SQLRowCount에서 0을 반환합니다. SQL Server Native Client ODBC 드라이버 버전에서는 드라이버별 SQLGetStmtAttr 옵션인 SQL_SOPT_SS_NOCOUNT_STATUS를 도입하여 NOCOUNT 옵션이 ON인지 OFF인지를 보고합니다. SQLRowCount에서 0을 반환할 때마다 응용 프로그램이 SQL_SOPT_SS_NOCOUNT_STATUS를 테스트해야 합니다. SQL_NC_ON이 반환되는 경우 SQLRowCount 값 0은 SQL Server에서 행 수를 반환하지 않았다는 것만 나타냅니다. SQL_NC_OFF가 반환되는 경우 NOCOUNT가 해제되어 있음을 의미하고, SQLRowCount 값 0은 문이 어떤 행에도 적용되지 않았음을 나타냅니다. SQL_SOPT_SS_NOCOUNT_STATUS가 SQL_NC_OFF인 경우에는 응용 프로그램에서 SQLRowCount 값을 표시하면 안 됩니다. 큰 일괄 처리나 저장 프로시저에는 여러 개의 SET NOCOUNT 문이 포함될 수 있으므로 프로그래머는 SQL_SOPT_SS_NOCOUNT_STATUS가 일정하게 유지된다고 가정할 수 없습니다. SQLRowCount에서 0을 반환할 때마다 이 옵션을 테스트해야 합니다.
다른 몇 개의 Transact-SQL 문은 데이터를 결과 집합이 아닌 메시지로 반환합니다. SQL Server Native Client ODBC 드라이버가 이러한 메시지를 받으면 SQL_SUCCESS_WITH_INFO를 반환하여 정보 메시지를 사용할 수 있다고 응용 프로그램에 알립니다. 그러면 응용 프로그램에서 SQLGetDiagRec를 호출하여 해당 메시지를 검색할 수 있습니다. 이런 방식으로 작동하는 Transact-SQL 문은 다음과 같습니다.
DBCC
SET SHOWPLAN(이전 버전의 SQL Server에서 사용 가능)
SET STATISTICS
PRINT
RAISERROR
SQL Server Native Client ODBC 드라이버는 심각도 11 이상의 RAISERROR가 발생할 경우 SQL_ERROR를 반환합니다. RAISERROR의 심각도가 19이면 연결도 삭제됩니다.
SQL 문의 결과 집합을 처리하기 위해 응용 프로그램은 다음 작업을 수행합니다.
결과 집합의 특징을 확인합니다.
열을 프로그램 변수에 바인딩합니다.
단일 값, 전체 행의 값 또는 여러 행의 값을 검색합니다.
테스트를 통해 추가 결과 집합이 있는지 확인하고, 있는 경우 루프백하여 새 결과 집합의 특징을 확인합니다.
데이터 원본에서 행을 검색하고 응용 프로그램에 반환하는 프로세스를 인출이라고 합니다.
COMPUTE 및 COMPUTE BY 결과 집합 검색
COMPUTE BY 절은 결과 집합 내에 부분합을 생성하고 COMPUTE 절은 결과 집합의 끝에 합계를 생성합니다. SQL Server Native Client ODBC 드라이버는 각 SELECT 문에 대해 결과 집합을 여러 개 생성하여 이러한 합계와 부분합을 호출 응용 프로그램에 제공합니다.
다음 예에서는 COMPUTE BY를 사용하여 부분합을 생성하고 COMPUTE를 사용하여 합계를 생성합니다.
SELECT Title = CONVERT(char(20), title), type, price, advance
FROM Titles
WHERE ytd_sales IS NOT NULL
AND type LIKE '%cook%'
ORDER BY type DESC
COMPUTE AVG(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)
이러한 문에서는 평균 가격에 대해 부분합이 계산되고 각 책 유형에 대해 선금 합계가 계산된 다음 가격 및 선금 데이터의 최종 합계가 계산됩니다. 드라이버는 첫 번째 책 유형을 가진 책의 행에 대해 첫 번째 결과 집합을 제공합니다. 그런 다음 첫 번째 책 집합의 AVG(price) 및 SUM(advance)에 사용된 두 개의 COMPUTE BY 열을 사용하여 두 번째 결과 집합을 생성합니다. 다음 책 그룹에 대해 세 번째 결과 집합을 생성하고, 해당 그룹의 COMPUTE BY 부분합을 사용하여 네 번째 결과 집합을 생성합니다. 드라이버는 COMPUTE SUM(price), SUM(advance) 절의 합계가 포함된 최종 결과 집합을 생성할 때까지 이러한 결과 집합을 교대로 생성합니다.