다음을 통해 공유


결과 데이터 페치

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

ODBC 애플리케이션에는 결과 데이터를 가져오는 세 가지 옵션이 있습니다.

첫 번째 옵션은 SQLBindCol을 기반으로 하는 것입니다. 결과 집합을 가져오기 전에 애플리케이션은 SQLBindCol을 사용하여 결과 집합의 각 열을 프로그램 변수에 바인딩합니다. 열이 바인딩된 후 드라이버는 애플리케이션이 SQLFetch 또는 SQLFetchScroll을 호출할 때마다 현재 행의 데이터를 결과 집합 열에 바인딩된 변수로 전송합니다. 결과 집합 열과 프로그램 변수의 데이터 형식이 다르면 드라이버가 데이터 변환을 처리합니다. 애플리케이션이 1보다 큰 SQL_ATTR_ROW_ARRAY_SIZE 설정한 경우 결과 열을 SQLFetchScroll에 대한 각 호출에 채워지는 변수 배열에 바인딩할 수 있습니다.

두 번째 옵션은 SQLGetData를 기반으로 합니다. 애플리케이션은 SQLBindCol을 사용하여 결과 집합 열을 프로그램 변수에 바인딩하지 않습니다. SQLFetch를 호출할 때마다 애플리케이션은 결과 집합의 각 열에 대해 SQLGetData를 한 번 호출합니다. SQLGetData 는 특정 결과 집합 열에서 특정 프로그램 변수로 데이터를 전송하도록 드라이버에 지시하고 열 및 변수의 데이터 형식을 지정합니다. 이를 통해 드라이버는 결과 열과 프로그램 변수의 데이터 형식이 다를 경우 데이터를 변환할 수 있습니다. 텍스트, ntext이미지 열은 일반적으로 너무 커서 프로그램 변수에 맞지 않지만 SQLGetData를 사용하여 검색할 수 있습니다. 결과 열의 텍스트, ntext 또는 이미지 데이터가 프로그램 변수보다 크면 SQLGetData는 SQL_SUCCESS_WITH_INFO 및 SQLSTATE 01004(문자열 데이터, 오른쪽 잘림)를 반환합니다. SQLGetData에 대한 연속 호출은 텍스트 또는 이미지 데이터의 연속된 청크를 반환합니다. 데이터의 끝에 도달 하면 SQLGetData 는 SQL_SUCCESS 반환합니다. SQL_ATTR_ROW_ARRAY_SIZE 1보다 큰 경우 각 인출은 행 집합 또는 행 집합을 반환합니다. SQLGetData를 사용하기 전에 먼저 SQLSetPos를 사용하여 행 집합 내의 특정 행을 현재 행으로 지정해야 합니다.

세 번째 옵션은 SQLBindCol 및 SQLGetData를 혼합하여 사용하는 것입니다. 예를 들어 애플리케이션은 결과 집합의 처음 10개 열을 바인딩한 다음 각 인출에서 SQLGetData를 세 번 호출하여 언바운드 열 3개에서 데이터를 검색할 수 있습니다. 일반적으로 결과 집합에 하나 이상의 텍스트 또는 이미지 열이 포함된 경우에 사용됩니다.

결과 집합에 대해 설정된 커서 옵션에 따라 애플리케이션은 SQLFetchScroll스크롤 옵션을 사용하여 결과 집합을 스크롤할 수도 있습니다.

SQLBindCol이 ODBC 드라이버에서 메모리를 할당하도록 하기 때문에 결과 집합 열을 프로그램 변수에 바인딩하는 데 SQLBindCol을 과도하게 사용하면 비용이 많이 듭니다. 결과 열을 변수에 바인딩하는 경우 SQLFreeHandle을 호출하여 문 핸들을 해제하거나 fOption이 SQL_UNBIND 설정된 SQLFreeStmt를 호출할 때까지 해당 바인딩이 계속 적용됩니다. 문이 완료되면 바인딩이 자동으로 실행 취소되지 않습니다.

이 논리를 사용하면 서로 다른 매개 변수를 사용하여 동일한 SELECT 문을 여러 번 실행하는 작업을 효과적으로 처리할 수 있습니다. 결과 집합은 동일한 구조를 유지하므로 결과 집합을 한 번 바인딩하고, 모든 SELECT 문을 처리한 다음, fOption이 설정된 SQLFreeStmt 를 호출하여 마지막 실행 후 SQL_UNBIND 수 있습니다. 먼저 fOption이 설정된 SQLFreeStmt를 호출하여 이전 바인딩을 해제하도록 SQL_UNBIND SQLBindCol을 호출하여 결과 집합의 열을 바인딩하면 안 됩니다.

SQLBindCol을 사용하는 경우 행 단위 또는 열 단위 바인딩을 수행할 수 있습니다. 행 단위 바인딩은 열 단위 바인딩보다 다소 빠릅니다.

SQLBindCol을 사용하여 결과 집합 열을 바인딩하는 대신 SQLGetData를 사용하여 열 단위로 데이터를 검색할 수 있습니다. 결과 집합에 몇 개의 행만 포함된 경우 SQLBindCol 대신 SQLGetData를 사용하는 것이 더 빠릅니다. 그렇지 않으면 SQLBindCol이 최상의 성능을 제공합니다. 항상 동일한 변수 집합에 데이터를 배치하지 않는 경우 지속적으로 다시 바인딩하는 대신 SQLGetData를 사용해야 합니다. 모든 열이 SQLBindCol로 바인딩된 후에는 선택 목록에 있는 열에서만 SQLGetData를 사용할 수 있습니다. 또한 이 열은 SQLGetData를 이미 사용한 열 뒤에도 나타나야 합니다.

SQLGetData, SQLBindColSQLBindParameter와 같은 프로그램 변수로 또는 외부로 데이터를 이동하는 ODBC 함수는 암시적 데이터 형식 변환을 지원합니다. 예를 들어 애플리케이션이 정수 열을 문자열 프로그램 변수에 바인딩하는 경우 드라이버는 자동으로 데이터를 정수에서 문자로 변환한 후 프로그램 변수에 배치합니다.

애플리케이션의 데이터 변환을 최소화해야 합니다. 애플리케이션에서 수행하는 처리에 데이터 변환이 필요하지 않은 경우 애플리케이션은 동일한 데이터 형식의 프로그램 변수에 열과 매개 변수를 바인딩해야 합니다. 그러나 데이터를 한 형식에서 다른 형식으로 변환해야 하는 경우 애플리케이션에서 수행하는 것보다 드라이버가 변환을 수행하도록 하는 것이 더 효율적입니다. SQL Server Native Client ODBC 드라이버는 일반적으로 네트워크 버퍼에서 애플리케이션의 변수로 직접 데이터를 전송합니다. 데이터 변환을 수행하도록 드라이버에 요청하면 드라이버는 데이터를 버퍼링한 후 CPU 주기를 사용하여 데이터를 변환합니다.

프로그램 변수는 텍스트, ntext이미지 데이터를 제외하고 열에서 전송된 데이터를 저장할 수 있을 만큼 커야 합니다. 애플리케이션에서 결과 집합 데이터를 검색하여 너무 작은 변수에 배치하려고 하면 드라이버가 경고를 생성합니다. 이렇게 하면 드라이버가 메시지에 대한 메모리를 할당하고 드라이버와 애플리케이션 모두 메시지를 처리하고 오류 처리를 수행하는 데 CPU 주기를 소비해야 합니다. 애플리케이션은 검색되는 데이터를 저장할 수 있을 만큼 큰 변수를 할당하거나 선택 목록에서 SUBSTRING 함수를 사용하여 결과 집합의 열 크기를 줄여야 합니다.

SQL_C_DEFAULT 사용하여 C 변수의 형식을 지정할 때는 주의해야 합니다. SQL_C_DEFAULT C 변수의 형식이 열 또는 매개 변수의 SQL 데이터 형식과 일치하게 지정합니다. ntext, nchar 또는 nvarchar 열에 대해 SQL_C_DEFAULT 지정하면 유니코드 데이터가 애플리케이션에 반환됩니다. 이렇게 하면 애플리케이션이 유니코드 데이터를 처리하도록 코딩되지 않은 경우 다양한 문제가 발생할 수 있습니다. 동일한 유형의 문제는 SQL_GUID(uniqueidentifier) 데이터 형식에서 발생할 수 있습니다.

텍스트, ntext이미지 데이터는 일반적으로 너무 커서 단일 프로그램 변수에 맞지 않으며 일반적으로 SQLBindCol 대신 SQLGetData처리됩니다. 서버 커서를 사용하는 경우 SQL Server Native Client ODBC 드라이버는 행을 가져올 때 언바운드 텍스트, ntext 또는 이미지 열에 대한 데이터를 전송하지 않도록 최적화됩니다. 텍스트, ntext 또는 이미지 데이터는 애플리케이션이 열에 대해 SQLGetData를 발급할 때까지 서버에서 실제로 검색되지 않습니다.

사용자가 커서를 위아래로 스크롤하는 동안 텍스트, ntext 또는 이미지 데이터가 표시되지 않도록 애플리케이션에 이 최적화를 적용할 수 있습니다. 사용자가 행을 선택한 후 애플리케이션은 SQLGetData를 호출하여 텍스트, ntext 또는 이미지 데이터를 검색할 수 있습니다. 이렇게 하면 사용자가 선택하지 않는 행에 대한 텍스트, ntext 또는 이미지 데이터 전송이 저장되고 매우 많은 양의 데이터 전송을 저장할 수 있습니다.

참고 항목

결과 처리(ODBC)