Freigeben über


bcp_init

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Initialisiert den Massenkopiervorgang.

Syntax

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

Unicode- und ANSI-Namen:

  • bcp_initA (ANSI)
  • bcp_initW (Unicode)

Argumente

hdbc
Das für den Massenkopiervorgang aktivierte ODBC-Verbindungshandle.

szTable
Name der Datenbanktabelle, in die bzw. aus der kopiert werden soll. Dieser Name kann auch den Namen der Datenbank oder den Namen des Besitzers enthalten. Beispiel: pubs.gracie.titles, pubs.. "titles", "gracie.titles" und "titles " sind alle rechtlichen Tabellennamen.

Wenn eDirection DB_OUT ist, kann szTable auch der Name einer Datenbankansicht sein.

Wenn eDirection DB_OUT ist und eine SELECT-Anweisung mithilfe von bcp_control angegeben wird, bevor bcp_exec aufgerufen wird, muss bcp_init szTable auf NULL festgelegt werden.

szDataFile
Name der Benutzerdatei, in die bzw. aus der kopiert werden soll. Wenn Daten mithilfe von bcp_sendrow direkt aus Variablen kopiert werden, legen Sie "szDataFile " auf NULL fest.

szErrorFile
Der Name der Fehlerdatei, in die Statusmeldungen, Fehlermeldungen und Kopien von Zeilen geschrieben werden sollen, die aus einem bestimmten Grund nicht von einer Benutzerdatei in eine Tabelle kopiert werden konnten. Wenn NULL als szErrorFile übergeben wird, wird keine Fehlerdatei verwendet.

eDirection
Die Richtung der Kopie, entweder DB_IN oder DB_OUT. DB_IN bedeutet eine Kopie aus Programmvariablen oder aus einer Benutzerdatei in eine Tabelle. DB_OUT bedeutet eine Kopie von einer Datenbanktabelle in eine Benutzerdatei an. Sie müssen einen Benutzerdateinamen mit DB_OUT angeben.

Gibt zurück

SUCCEED oder FAIL.

Hinweise

Rufen Sie bcp_init auf, bevor Sie eine andere Massenkopiefunktion aufrufen. bcp_init führt die erforderlichen Initialisierungen für eine Massenkopie von Daten zwischen der Arbeitsstation und SQL Server aus.

Die funktion bcp_init muss mit einem ODBC-Verbindungshandle bereitgestellt werden, das für die Verwendung mit Massenkopiefunktionen aktiviert ist. Um das Handle zu aktivieren, verwenden Sie SQLSetConnectAttr , wobei SQL_COPT_SS_BCP auf SQL_BCP_ON für ein zugeordnetes, aber nicht verbundenes Verbindungshandle festgelegt ist. Wenn Sie versuchen, das Attribut einem bereits verbundenen Verbindungshandle zuzuweisen, tritt ein Fehler auf.

Wenn eine Datendatei angegeben wird, überprüft bcp_init die Struktur der Datenbankquelle oder Zieltabelle, nicht die Datendatei. bcp_init gibt Datenformatwerte für die Datendatei basierend auf jeder Spalte in der Datenbanktabelle, Ansicht oder SELECT-Resultset an. Diese Spezifikation enthält unter anderem den Datentyp jeder Spalte, das Vorhandensein bzw. Nichtvorhandensein eines Längen- oder NULL-Wertindikators und von Bytezeichenfolgen des Abschlusszeichens der Daten, sowie die Breite von Datentypen fester Länge. bcp_init legt diese Werte wie folgt fest:

  • Der angegebene Datentyp entspricht dem Datentyp der Spalte in der Datenbanktabelle, der Sicht oder dem SELECT-Resultset. Der Datentyp wird von sql Server nativen Datentypen aufgelistet, die in sqlncli.h angegeben sind. Die Daten selbst werden in computereigenem Format dargestellt, Das heißt, Daten aus einer Spalte mit ganzzahligen Datentypen werden durch eine Vier-Byte-Sequenz dargestellt, die auf dem Computer basiert, auf dem die Datendatei erstellt wurde.

  • Wenn ein Datenbankdatentyp eine feste Länge hat, haben auch die Daten der Datendatei eine feste Länge. Massenkopiefunktionen, die Daten verarbeiten (z. B. bcp_exec), analysieren Datenzeilen, die erwarten, dass die Länge der Daten in der Datendatei mit der Länge der in der Datenbanktabelle, Ansicht oder SELECT-Spaltenliste angegebenen Daten identisch ist. Beispielsweise müssen Daten für eine Datenbankspalte, die als Zeichen (13) definiert ist, für jede Datenzeile in der Datei durch 13 Zeichen dargestellt werden. Für Daten mit fester Länge kann ein NULL-Indikator verwendet werden, wenn die Datenbankspalte NULL-Werte zulässt.

  • Wenn eine Bytesequenz für Abschlusszeichen definiert ist, wird deren Länge auf 0 festgelegt.

  • Beim Kopieren in SQL Server muss die Datendatei über Daten für jede Spalte in der Datenbanktabelle verfügen. Beim Kopieren aus SQL Server werden Daten aus allen Spalten in der Datenbanktabelle, Ansicht oder SELECT-Resultset in die Datendatei kopiert.

  • Beim Kopieren in SQL Server muss die Ordnungsposition einer Spalte in der Datendatei mit der Ordnungsposition der Spalte in der Datenbanktabelle identisch sein. Beim Kopieren aus SQL Server platziert bcp_exec Daten basierend auf der Ordnungsposition der Spalte in der Datenbanktabelle.

  • Wenn ein Datenbankdatentyp variabler Länge ist (z . B. varbinary(22)) oder wenn eine Datenbankspalte Nullwerte enthalten kann, werden die Daten in der Datendatei einem Längen-/Nullindikator vorangestellt. Die Breite des Indikators ändert sich auf der Grundlage des Datentyps und der Version der Massenkopierfunktion.

Rufen Sie bcp_columns und bcp_colfmt auf, um die für eine Datendatei angegebenen Datenformatwerte zu ändern.

Massenkopien in SQL Server können für Tabellen optimiert werden, die keine Indizes enthalten, indem sie das Datenbankwiederherstellungsmodell auf SIMPLE oder BULK_LOGGED festlegen. Weitere Informationen finden Sie unter Voraussetzungen für die minimale Protokollierung im Massenimport und ALTER DATABASE.

Wenn keine Datendatei verwendet wird, müssen Sie bcp_bind aufrufen, um das Format und den Speicherort im Speicher der Daten für jede Spalte anzugeben, und dann Datenzeilen mithilfe von bcp_sendrow in den SQL Server kopieren.

Beispiel

Dieses Beispiel zeigt, wie die ODBC-Funktion bcp_init mit einer Formatdatei verwendet wird.

Bevor Sie den C++-Code kompilieren und ausführen, sind folgende Schritte erforderlich:

  • Erstellen einer ODBC-Datenquelle mit dem Namen "Test". Sie können diese Datenquelle einer beliebigen Datenbank zuordnen.

  • Führen Sie die folgenden Transact-SQL-Dateien in der Datenbank aus:

    CREATE TABLE BCPDate (cola int, colb datetime);  
    
  • Fügen Sie dem Verzeichnis, in dem Sie die Anwendung ausführen, eine Datei namens Bcpfmt.fmt hinzu, und fügen Sie Folgendes in die Datei ein:

    8.0  
    2  
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
    
  • Fügen Sie dem Verzeichnis, in dem Sie die Anwendung ausführen, eine Datei namens Bcpodbc.bcp hinzu, und fügen Sie Folgendes in die Datei ein:

    1  
    2  
    

Nun sind Sie bereit, C++-Code zu kompilieren und auszuführen.

// 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);  
}  
  

Weitere Informationen

Massenkopierfunktionen