Massenkopieren aus Programmvariablen

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

Sie können Massenkopiervorgänge direkt aus Programmvariablen durchführen. Rufen Sie nach dem Zuweisen von Variablen zum Speichern der Daten für eine Zeile und dem Aufrufen von bcp_init zum Starten der Massenkopie bcp_bind für jede Spalte auf, um den Speicherort und das Format der Programmvariable anzugeben, die der Spalte zugeordnet werden soll. Füllen Sie jede Variable mit Daten aus, und rufen Sie dann bcp_sendrow auf, um eine Datenzeile an den Server zu senden. Wiederholen Sie den Vorgang zum Ausfüllen der Variablen, und rufen Sie bcp_sendrow auf, bis alle Zeilen an den Server gesendet wurden, und rufen Sie dann bcp_done auf, um anzugeben, dass der Vorgang abgeschlossen ist.

Der bcp_bindpData-Parameter enthält die Adresse der Variablen, die an die Spalte gebunden wird. Die Daten für die einzelnen Spalten können auf zweierlei Weise gespeichert werden:

  • Zuordnen einer Variable für die Daten.

  • Zuordnen einer Indikatorvariable, unmittelbar gefolgt von der Datenvariable.

Die Indikatorvariable gibt die Datenlänge für Spalten mit variabler Länge an und zeigt gegebenenfalls an, dass NULL-Werte für die Spalte zulässig sind. Wenn nur eine Datenvariable verwendet wird, wird die Adresse dieser Variablen im bcp_bindpData-Parameter gespeichert. Wenn eine Indikatorvariable verwendet wird, wird die Adresse der Indikatorvariable im bcp_bindpData-Parameter gespeichert. Die Massenkopiefunktionen berechnen den Speicherort der Datenvariable, indem sie die bcp_bindcbIndicator- und pData-Parameter hinzufügen.

bcp_bind unterstützt drei Methoden für den Umgang mit Daten mit variabler Länge:

  • Verwenden Sie cbData nur mit einer Datenvariable. Platzieren Sie die Länge der Daten in cbData. Rufen Sie jedes Mal, wenn die Länge der zu kopierenden Daten in Massen kopiert wird, bcp_collen auf, um cbData zurückzusetzen. Wenn eine der anderen beiden Methoden verwendet wird, geben Sie SQL_VARLEN_DATA für cbData an. Wenn alle für eine Spalte bereitgestellten Datenwerte NULL sind, geben Sie SQL_NULL_DATA für cbData an.

  • Verwenden von Indikatorvariablen. Speichern Sie beim Verschieben des jeweiligen neuen Datenwerts in die Datenvariable die Länge des Werts in der Indikatorvariable. Wenn eine der anderen beiden Methoden verwendet wird, geben Sie 0 für cbIndicator an.

  • Verwenden von Abschlusszeichenzeigern. Laden Sie den bcp_bindpTerm-Parameter mit der Adresse des Bitmusters, das die Daten beendet. Wenn eine der anderen beiden Methoden verwendet wird, geben Sie NULL für pTerm an.

Alle drei dieser Methoden können auf demselben bcp_bind Aufruf verwendet werden, in diesem Fall wird die Spezifikation verwendet, die zu der kleinsten Datenmenge führt, die kopiert wird.

Der bcp_bindTypparameter verwendet DB-Library-Datentypbezeichner und keine ODBC-Datentypbezeichner. DB-Library-Datentypbezeichner werden in sqlncli.h für die Verwendung mit der ODBC-bcp_bind-Funktion definiert.

Funktionen zum Massenkopieren unterstützen nicht alle ODBC C-Datentypen. Beispielsweise unterstützen die Massenkopienfunktionen die ODBC-SQL_C_TYPE_TIMESTAMP-Struktur nicht. Verwenden Sie daher SQLBindCol oder SQLGetData , um ODBC-SQL_TYPE_TIMESTAMP-Daten in eine SQL_C_CHAR Variable zu konvertieren. Wenn Sie dann bcp_bind mit einem Typparameter von SQLCHARACTER verwenden, um die Variable an eine SQL Server-Datetime-Spalte zu binden, konvertieren die Massenkopiefunktionen die Timestamp-Escapeklausel in der Zeichenvariable in das richtige Datetime-Format.

In der folgenden Tabelle sind die empfohlenen Datentypen aufgeführt, die bei der Zuordnung von einem ODBC-SQL-Datentyp zu einem SQL Server-Datentyp verwendet werden sollen.

ODBC SQL-Datentyp ODBC C-Datentyp bcp_bind Typparameter SQL Server-Datentyp
SQL_CHAR SQL_C_CHAR SQLCHARACTER character

char
SQL_VARCHAR SQL_C_CHAR SQLCHARACTER varchar

Zeichen variierend

char varying

sysname
SQL_LONGVARCHAR SQL_C_CHAR SQLCHARACTER text
SQL_WCHAR SQL_C_WCHAR SQLNCHAR nchar
SQL_WVARCHAR SQL_C_WCHAR SQLNVARCHAR nvarchar
SQL_WLONGVARCHAR SQL_C_WCHAR SQLNTEXT ntext
SQL_DECIMAL SQL_C_CHAR SQLCHARACTER decimal

dec

money

smallmoney
SQL_NUMERIC SQL_C_NUMERIC SQLNUMERICN numeric
SQL_BIT SQL_C_BIT SQLBIT bit
SQL_TINYINT (mit Vorzeichen) SQL_C_SSHORT SQLINT2 smallint
SQL_TINYINT (ohne Vorzeichen) SQL_C_UTINYINT SQLINT1 tinyint
SQL_SMALL_INT (mit Vorzeichen) SQL_C_SSHORT SQLINT2 smallint
SQL_SMALL_INT (ohne Vorzeichen) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER (mit Vorzeichen) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER (ohne Vorzeichen) SQL_C_CHAR SQLCHARACTER decimal

dec
SQL_BIGINT (mit und ohne Vorzeichen) SQL_C_CHAR SQLCHARACTER bigint
SQL_REAL SQL_C_FLOAT SQLFLT4 real
SQL_FLOAT SQL_C_DOUBLE SQLFLT8 float
SQL_DOUBLE SQL_C_DOUBLE SQLFLT8 float
SQL_BINARY SQL_C_BINARY SQLBINARY binary

timestamp
SQL_VARBINARY SQL_C_BINARY SQLBINARY varbinary

binary varying
SQL_LONGVARBINARY SQL_C_BINARY SQLBINARY Abbildung
SQL_TYPE_DATE SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIME SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIMESTAMP SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_GUID SQL_C_GUID SQLUNIQUEID uniqueidentifier
SQL_INTERVAL_ SQL_C_CHAR SQLCHARACTER char

SQL Server verfügt nicht über signierte , nicht signierte Smallint- oder nicht signierte Int-Datentypen . Um den Verlust von Datenwerten beim Migrieren dieser Datentypen zu verhindern, erstellen Sie die SQL Server-Tabelle mit dem nächstgrößten ganzzahligen Datentyp. Um zu verhindern, dass Benutzer später Werte außerhalb des zulässigen Bereichs des ursprünglichen Datentyps hinzufügen, wenden Sie eine Regel auf die SQL Server-Spalte an, um die zulässigen Werte auf den Bereich einzuschränken, der vom Datentyp in der ursprünglichen Quelle unterstützt wird:

CREATE TABLE Sample_Ints(STinyIntCol   SMALLINT,  
USmallIntCol INT)  
GO  
CREATE RULE STinyInt_Rule  
AS   
@range >= -128 AND @range <= 127  
GO  
CREATE RULE USmallInt_Rule  
AS   
@range >= 0 AND @range <= 65535  
GO  
sp_bindrule STinyInt_Rule, 'Sample_Ints.STinyIntCol'  
GO  
sp_bindrule USmallInt_Rule, 'Sample_Ints.USmallIntCol'  
GO  

SQL Server unterstützt keine Intervalldatentypen direkt. Eine Anwendung kann jedoch Intervall-Escapesequenzen als Zeichenfolgen in einer SQL Server-Zeichenspalte speichern. Die Anwendung kann sie zur späteren Verwendung lesen, kann aber nicht in Transact-SQL-Anweisungen verwendet werden.

Die Massenkopiefunktionen können verwendet werden, um Daten schnell in SQL Server zu laden, die aus einer ODBC-Datenquelle gelesen wurden. Verwenden Sie SQLBindCol , um die Spalten eines Resultsets an Programmvariablen zu binden, und verwenden Sie dann bcp_bind , um dieselben Programmvariablen an einen Massenkopievorgang zu binden. Beim Aufrufen von SQLFetchScroll oder SQLFetch wird dann eine Datenzeile aus der ODBC-Datenquelle in die Programmvariablen abgerufen und bcp_sendrow Massenkopien der Daten aus den Programmvariablen in SQL Server kopiert.

Eine Anwendung kann die bcp_colptr-Funktion jederzeit verwenden, wenn sie die Adresse der Datenvariable ändern muss, die ursprünglich im bcp_bind pData-Parameter angegeben wurde. Eine Anwendung kann die bcp_collen-Funktion jederzeit verwenden, wenn sie die ursprünglich im bcp_bindcbData-Parameter angegebene Datenlänge ändern muss.

Daten aus SQL Server können nicht mithilfe von Massenkopie in Programmvariablen gelesen werden. es gibt nichts wie eine "bcp_readrow"-Funktion. Sie können nur Daten aus der Anwendung an den Server senden.

Weitere Informationen

Durchführen von Massenkopiervorgängen (ODBC)