다음을 통해 공유


bcp_init

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

대량 복사 작업을 초기화합니다.

구문

RETCODE bcp_init (  
        HDBC hdbc,  
        LPCTSTR szTable,  
        LPCTSTR szDataFile,  
        LPCTSTR szErrorFile,  
        INT eDirection);  

유니코드 및 ANSI 이름:

  • bcp_initA(ANSI)
  • bcp_initW(유니코드)

인수

hdbc
대량 복사 사용 ODBC 연결 핸들입니다.

szTable
복사할 데이터베이스 테이블의 이름입니다. 이 이름에는 데이터베이스 이름 또는 소유자 이름도 포함될 수 있습니다. 예를 들어 pubs.gracie.titles, pubs. 제목, gracie.titles제목은 모두 법적 테이블 이름입니다.

eDirection이 DB_OUT 경우 szTable은 데이터베이스 뷰의 이름일 수도 있습니다.

eDirection이 DB_OUT bcp_exec 호출되기 전에 bcp_control 사용하여 SELECT 문을 지정하는 경우 bcp_init szTable을 NULL로 설정해야 합니다.

szDataFile
복사의 원본 또는 대상이 될 사용자 파일의 이름입니다. bcp_sendrow 사용하여 변수에서 직접 데이터를 복사하는 경우 szDataFile을 NULL로 설정합니다.

szErrorFile
어떤 이유로든 사용자 파일에서 테이블로 복사할 수 없는 진행률 메시지, 오류 메시지 및 행의 복사본으로 채울 오류 파일의 이름입니다. NULL이 szErrorFile전달되면 오류 파일이 사용되지 않습니다.

eDirection
DB_IN 또는 DB_OUT 복사본의 방향입니다. DB_IN 프로그램 변수 또는 사용자 파일에서 테이블로의 복사본을 나타냅니다. DB_OUT 데이터베이스 테이블에서 사용자 파일로의 복사본을 나타냅니다. DB_OUT 사용자 파일 이름을 지정해야 합니다.

반품

SUCCEED 또는 FAIL

설명

다른 대량 복사 함수를 호출하기 전에 bcp_init 호출합니다. bcp_init 워크스테이션과 SQL Server 간의 대량 데이터 복사에 필요한 초기화를 수행합니다.

bcp_init 함수는 대량 복사 함수에 사용할 수 있도록 설정된 ODBC 연결 핸들과 함께 제공되어야 합니다. 핸들을 사용하도록 설정하려면 할당되었지만 연결되지 않은 연결 핸들에서 SQL_BCP_ON SQL_COPT_SS_BCP 설정된 SQLSetConnectAttr를 사용합니다. 연결된 핸들에 특성을 할당하려고 시도하면 오류가 발생합니다.

데이터 파일을 지정 하면 bcp_init 데이터 파일이 아닌 데이터베이스 원본 또는 대상 테이블의 구조를 검사합니다. bcp_init 데이터베이스 테이블, 뷰 또는 SELECT 결과 집합의 각 열을 기반으로 데이터 파일의 데이터 형식 값을 지정합니다. 이 사양에는 각 열의 데이터 형식, 데이터의 길이 또는 null 표시기 및 종결자 바이트 문자열의 존재 여부 및 고정 길이 데이터 형식의 너비가 포함됩니다. bcp_init 다음과 같이 이러한 값을 설정합니다.

  • 지정된 데이터 형식은 데이터베이스 테이블, 뷰 또는 SELECT 결과 집합에 있는 열의 데이터 형식입니다. 데이터 형식은 sqlncli.h에 지정된 SQL Server 네이티브 데이터 형식으로 열거됩니다. 데이터 자체는 컴퓨터 형식으로 표시됩니다. 즉, 정수 데이터 형식 열의 데이터는 데이터 파일을 만든 컴퓨터에 따라 big-or little-endian인 4 바이트 시퀀스로 표시됩니다.

  • 데이터베이스 데이터 형식의 길이가 고정된 경우 데이터 파일 데이터도 길이가 고정됩니다. 데이터(예 : bcp_exec)를 처리하는 대량 복사 함수는 데이터 파일의 데이터 길이가 데이터베이스 테이블, 뷰 또는 SELECT 열 목록에 지정된 데이터의 길이와 동일할 것으로 예상하는 데이터 행을 구문 분석합니다. 예를 들어 char(13)정의된 데이터베이스 열의 데이터는 파일의 각 데이터 행에 대해 13자로 표현되어야 합니다. 데이터베이스 열에서 null 값을 허용하는 경우 고정 길이 데이터에 null 표시기를 접두사로 지정할 수 있습니다.

  • 종결자 바이트 시퀀스가 정의되면 종결자 바이트 시퀀스의 길이가 0으로 설정됩니다.

  • SQL Server로 복사할 때 데이터 파일에는 데이터베이스 테이블의 각 열에 대한 데이터가 있어야 합니다. SQL Server에서 복사할 때 데이터베이스 테이블, 뷰 또는 SELECT 결과 집합에 있는 모든 열의 데이터가 데이터 파일에 복사됩니다.

  • SQL Server로 복사할 때 데이터 파일의 열 서수 위치는 데이터베이스 테이블에 있는 열의 서수 위치와 동일해야 합니다. SQL Server 에서 복사할 때 bcp_exec 데이터베이스 테이블에 있는 열의 서수 위치에 따라 데이터를 배치합니다.

  • 데이터베이스 데이터 형식이 길이(예 : varbinary(22)) 변수이거나 데이터베이스 열에 null 값이 포함될 수 있는 경우 데이터 파일의 데이터에 길이/null 표시기가 접두사로 추가됩니다. 표시자의 길이는 데이터 형식 및 대량 복사 버전에 따라 다릅니다.

데이터 파일에 지정된 데이터 형식 값을 변경하려면 bcp_columns 호출하고 bcp_colfmt.

데이터베이스 복구 모델을 SIMPLE 또는 BULK_LOGGED 설정하여 인덱스가 포함되지 않은 테이블에 대해 SQL Server로 대량 복사를 최적화할 수 있습니다. 자세한 내용은 대량 가져오기ALTER DATABASE의 최소 로깅에 대한 필수 구성 요소를 참조하세요.

데이터 파일이 사용되지 않는 경우 bcp_bind 호출하여 각 열의 데이터 메모리에 있는 형식과 위치를 지정한 다음, bcp_sendrow 사용하여 데이터 행을 SQL Server에 복사해야 합니다.

예시

이 샘플에서는 형식 파일과 함께 ODBC bcp_init 함수를 사용하는 방법을 보여줍니다.

C++ 코드를 컴파일하고 실행하기 전에 다음을 수행해야 합니다.

  • Test라는 ODBC 데이터 원본을 만듭니다. 이 데이터 원본을 모든 데이터베이스와 연결할 수 있습니다.

  • 데이터베이스에서 다음 Transact-SQL을 실행합니다.

    CREATE TABLE BCPDate (cola int, colb datetime);  
    
  • 애플리케이션을 실행할 디렉터리에서 Bcpfmt.fmt라는 파일을 추가하고 이 파일을 파일에 추가합니다.

    8.0  
    2  
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
    
  • 애플리케이션을 실행할 디렉터리에서 Bcpodbc.bcp라는 파일을 추가하고 파일에 추가합니다.

    1  
    2  
    

이제 C++ 코드를 컴파일하고 실행할 준비가 되었습니다.

// compile with: odbc32.lib sqlncli11.lib  
#include <stdio.h>  
#include <windows.h>  
#include <sql.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
SQLHENV henv = SQL_NULL_HENV;  
HDBC hdbc1 = SQL_NULL_HDBC;   
  
void Cleanup() {  
   if (hdbc1 != SQL_NULL_HDBC) {  
      SQLDisconnect(hdbc1);  
      SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   }  
  
   if (henv != SQL_NULL_HENV)  
      SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
  
int main() {  
   RETCODE retcode;  
   SDWORD cRows;  
  
   // Allocate the ODBC environment and save handle.  
   retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(Env) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Notify ODBC that this is an ODBC 3.0 app.  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLSetEnvAttr(ODBC version) Failed\n\n");  
      Cleanup();  
      return(9);      
   }  
  
   // Allocate ODBC connection handle, set BCP mode, and connect.  
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   retcode = SQLSetConnectAttr(hdbc1, SQL_COPT_SS_BCP, (void *)SQL_BCP_ON, SQL_IS_INTEGER);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLSetConnectAttr(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Sample uses Integrated Security. Create SQL Server DSN using Windows NT authentication.  
   retcode = SQLConnect(hdbc1, (UCHAR*)"Test", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);  
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLConnect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Initialize the bulk copy.  
   retcode = bcp_init(hdbc1, "BCPDate", "BCPODBC.bcp", NULL, DB_IN);  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_init(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Read the format file.  
   retcode = bcp_readfmt(hdbc1, "BCPFMT.fmt");  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_readfmt(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Execute the bulk copy.  
   retcode = bcp_exec(hdbc1, &cRows);  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_exec(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   printf("Number of rows bulk copied in = %d.\n", cRows);  
  
   // Cleanup  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
  

참고 항목

대량 복사 함수