Criar um arquivo de formato de cópia em massa (ODBC)
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)
Este exemplo mostra como usar funções de cópia em massa para criar um arquivo de dados e um arquivo de formato. Esse exemplo foi desenvolvido para o ODBC versão 3.0 ou posterior.
Importante
Quando possível, use a Autenticação do Windows. Se a Autenticação do Windows não estiver disponível, solicite aos usuários que digitem suas credenciais em tempo de execução. Evite armazenar as credenciais em um arquivo. Se for necessário manter as credenciais, criptografe-as com a Win32 crypto API(em inglês).
Para criar um arquivo de formato de cópia em massa
Aloque um identificador de ambiente e um identificador de conexão.
Defina SQL_COPT_SS_BCP e SQL_BCP_ON para habilitar operações de cópia em massa.
Conecte-se ao SQL Server.
Ligue para bcp_init para definir as seguintes informações:
O nome da tabela ou da exibição da qual ou para a qual será feita a cópia em massa.
O nome do arquivo de dados que contém os dados a serem copiados para o banco de dados ou que recebe os dados ao copiar do banco de dados.
O nome de um arquivo de dados que receberá qualquer mensagem de erro de cópia em massa (especifique NULL se não desejar um arquivo de mensagens).
A direção da cópia: DB_OUT para o arquivo da tabela ou exibição.
Chame bcp_columns para definir o número de colunas.
Chame bcp_colfmt para cada coluna para definir suas características no arquivo de dados.
Chame bcp_writefmt para criar um arquivo de formato que descreva o arquivo de dados a ser criado pela operação de cópia em massa.
Chame bcp_exec para executar a operação de cópia em massa.
Uma operação de cópia em massa executada dessa forma cria um arquivo de dados que contém os dados copiados e um arquivo de formato que descreve o layout do arquivo de dados.
Exemplo
Será necessária uma fonte de dados ODBC chamada AdventureWorks, cujo banco de dados padrão é o banco de dados de exemplo AdventureWorks. (Você pode baixar o banco de dados de exemplo AdventureWorks no Home page de Exemplos e Projetos da Comunidade do Microsoft SQL Server.) Essa fonte de dados deve ser baseada no driver ODBC fornecido pelo sistema operacional (o nome do driver é "SQL Server"). Se você compilar e executar esse exemplo como um aplicativo de 32 bits em um sistema operacional de 64 bits, deverá criar a fonte de dados ODBC com o Administrador ODBC em %windir%\SysWOW64\odbcad32.exe.
Este exemplo se conecta à instância padrão do SQL Server do computador. Para conectar-se a uma instância nomeada, altere a definição da fonte de dados ODBC para especificar a instância usando o seguinte formato: servidor\instância_nomeada. Por padrão, o SQL Server Express é instalado em uma instância nomeada.
Execute a primeira listagem de código (Transact-SQL) para criar a tabela que o exemplo usará.
Compile a segunda listagem de código (C++) com odbc32.lib e odbcbcp.lib.
Execute a terceira listagem de código (Transact-SQL) para excluir a tabela usada pelo exemplo.
USE AdventureWorks2022;
GO
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BCPDate')
DROP TABLE BCPDate
GO
CREATE TABLE BCPDate (cola int, colb datetime)
insert BCPDate(cola) values(1)
insert BCPDate(cola) values(2)
insert BCPDate(cola) values(3)
insert BCPDate(cola) values(4)
// compile with: odbc32.lib odbcbcp.lib
#include <stdio.h>
#include <string.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;
// BCP variables.
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 bulk copy 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("SQLSetEnvAttr(ODBC version) Failed\n\n");
Cleanup();
return(9);
}
// Sample uses Integrated Security, create SQL Server DSN using Windows NT authentication.
retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", 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_OUT);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Set the number of output columns.
retcode = bcp_columns(hdbc1, 2);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Describe the format of column 1 in the data file.
retcode = bcp_colfmt(hdbc1, 1, SQLCHARACTER, -1, 5, NULL, 0, 1);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Describe the format of column 2 in the data file.
retcode = bcp_colfmt(hdbc1, 2, SQLCHARACTER, -1, 20, NULL, 0, 2);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Create the format file.
retcode = bcp_writefmt(hdbc1, "c:\\BCPFMT.fmt");
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Execute the bulk copy.
retcode = bcp_exec(hdbc1, &cRows);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
printf("Number of rows bulk copied out = %d.\n", cRows);
// Cleanup
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}
USE AdventureWorks2022;
GO
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BCPDate')
DROP TABLE BCPDate
GO
Confira também
Tópicos de instrução sobre cópia em massa com o driver ODBC do SQL Server (ODBC)
Usando arquivos de dados e de formato