Compartilhar via


bcp_init

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

Inicializa a operação de cópia em massa.

Sintaxe

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

Nomes Unicode e ANSI:

  • bcp_initA (ANSI)
  • bcp_initW (Unicode)

Argumentos

hdbc
É o identificador de conexão ODBC habilitado para cópia em massa.

szTable
É o nome da tabela do banco de dados a ser copiada de ou para. Este nome também pode incluir o nome do banco de dados ou o nome do proprietário. Por exemplo, pubs.gracie.titles, pubs.. titles, gracie.titles e titles são todos nomes de tabelas legais.

Se eDirection for DB_OUT, szTable também poderá ser o nome de uma exibição de banco de dados.

Se eDirection for DB_OUT e uma instrução SELECT for especificada usando bcp_control antes de bcp_exec ser chamada, bcp_init szTable deverá ser definida como NULL.

szDataFile
É o nome do arquivo de usuário a ser copiado de ou para. Se os dados estiverem sendo copiados diretamente de variáveis usando bcp_sendrow, defina szDataFile como NULL.

szErrorFile
É o nome do arquivo de erro a ser preenchido com mensagens de progresso, mensagens de erro e cópias das linhas que, por algum motivo, não puderam ser copiadas de um arquivo de usuário para uma tabela. Se NULL for passado como szErrorFile, nenhum arquivo de erro será usado.

eDirection
É a direção da cópia, DB_IN ou DB_OUT. DB_IN indica uma cópia de variáveis do programa ou de um arquivo de usuário para uma tabela. DB_OUT indica uma cópia de uma tabela do banco de dados para um arquivo de usuário. Especifique um nome de arquivo de usuário com DB_OUT.

Devoluções

SUCCEED ou FAIL.

Comentários

Chame bcp_init antes de chamar qualquer outra função de cópia em massa. bcp_init executa as inicializações necessárias para uma cópia em massa de dados entre a estação de trabalho e o SQL Server.

A função bcp_init deve ser fornecida com um identificador de conexão ODBC habilitado para uso com funções de cópia em massa. Para habilitar o identificador, use SQLSetConnectAttr com SQL_COPT_SS_BCP definido como SQL_BCP_ON em um identificador de conexão alocado, mas não conectado. A tentativa de atribuir o atributo em um identificador conectado resulta em erro.

Quando um arquivo de dados é especificado, bcp_init examina a estrutura da tabela de origem ou de destino do banco de dados, não o arquivo de dados. bcp_init especifica valores de formato de dados para o arquivo de dados com base em cada coluna na tabela, exibição ou conjunto de resultados SELECT do banco de dados. Essa especificação inclui o tipo de dados de cada coluna, a presença ou ausência de um indicador de comprimento ou nulo e cadeias de caracteres de bytes de terminador nos dados, além da largura de tipos de dados de comprimento fixo. bcp_init define esses valores da seguinte maneira:

  • O tipo de dados especificado é o tipo de dados da coluna na tabela, exibição ou conjunto de resultados de SELECT do banco de dados. O tipo de dados é enumerado por tipos de dados nativos do SQL Server especificados em sqlncli.h. Os dados são representados em seu próprio formato de computador. Ou seja, os dados de uma coluna do tipo de dados inteiro são representados por uma sequência de quatro bytes que é big-endian ou little-endian com base no computador que criou o arquivo de dados.

  • Se um tipo de dados de banco de dados tiver comprimento fixo, os dados do arquivo de dados também terão comprimento fixo. As funções de cópia em massa que processam dados (por exemplo, bcp_exec) analisam linhas de dados esperando que o comprimento dos dados no arquivo de dados seja idêntico ao comprimento dos dados especificados na tabela, exibição ou lista de colunas SELECT do banco de dados. Por exemplo, os dados de uma coluna de banco de dados definida como char(13) devem ser representados por 13 caracteres para cada linha de dados no arquivo. Os dados de comprimento fixo podem ser prefixados com um indicador nulo se a coluna do banco de dados permitir valores nulos.

  • Quando a sequência de bytes de terminador é definida, o comprimento da sequência de bytes de terminador é definido como 0.

  • Ao copiar para o SQL Server, o arquivo de dados deve ter dados para cada coluna na tabela do banco de dados. Ao copiar do SQL Server, os dados de todas as colunas na tabela, exibição ou conjunto de resultados SELECT do banco de dados são copiados para o arquivo de dados.

  • Ao copiar para SQL Server, a posição ordinal de uma coluna no arquivo de dados deve ser idêntica à posição ordinal da coluna na tabela do banco de dados. Ao copiar do SQL Server, bcp_exec coloca dados com base na posição ordinal da coluna na tabela do banco de dados.

  • Se um tipo de dados de banco de dados for variável em comprimento (por exemplo, varbinary(22)) ou se uma coluna de banco de dados puder conter valores nulos, os dados no arquivo de dados serão prefixados por um indicador de comprimento/nulo. A largura do indicador varia dependendo do tipo de dados e da versão da cópia em massa.

Para alterar os valores de formato de dados especificados para um arquivo de dados, chame bcp_columns e bcp_colfmt.

As cópias em massa para o SQL Server podem ser otimizadas para tabelas que não contêm índices, definindo o modelo de recuperação de banco de dados como SIMPLE ou BULK_LOGGED. Para obter mais informações, consulte Pré-requisitos para registro em log mínimo na importação em massa e ALTER DATABASE.

Se nenhum arquivo de dados for usado, você deverá chamá bcp_bind para especificar o formato e o local na memória dos dados para cada coluna e, em seguida, copiar as linhas de dados para o SQL Server usando bcp_sendrow.

Exemplo

Este exemplo mostra como usar a função ODBC bcp_init com um arquivo de formato.

Antes de compilar e executar o código C++, você precisa fazer o seguinte:

  • Crie uma fonte de dados ODBC chamada Teste. Você pode associar essa fonte de dados a qualquer banco de dados.

  • Execute o seguinte Transact-SQL no banco de dados:

    CREATE TABLE BCPDate (cola int, colb datetime);  
    
  • No diretório onde você executará o aplicativo, adicione um arquivo chamado Bcpfmt.fmt e adicione isto ao arquivo:

    8.0  
    2  
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
    
  • No diretório onde você executará o aplicativo, adicione um arquivo chamado Bcpodbc.bcp e adicione isto ao arquivo:

    1  
    2  
    

Agora você está pronto para compilar e executar o código 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);  
}  
  

Confira também

Funções de cópia em massa