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.