Freigeben über


Ausführen von Massenkopievorgängen in SQL Server Native Client

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

Wichtig

SQL Server Native Client (SNAC) wird nicht ausgeliefert mit:

  • SQL Server 2022 (16.x) und höhere Versionen
  • SQL Server Management Studio 19 und spätere Versionen

Der SQL Server Native Client (SQLNCLI oder SQLNCLI11) und der Microsoft OLE DB-Legacyanbieter für SQL Server (SQLOLEDB) werden für neue Anwendungsentwicklungen nicht empfohlen.

Für neue Projekte verwenden Sie einen der folgenden Treiber:

Informationen zu SQLNCLI, das als Komponente der SQL Server-Datenbank-Engine (Versionen 2012 bis 2019) verfügbar ist, finden Sie in dieser Ausnahme für den Supportlebenszyklus.

Die Massenkopierfunktion von SQL Server unterstützt die Übertragung großer Datenmengen in bzw. aus einer SQL Server-Tabelle oder Sicht. Daten können auch mithilfe einer SELECT-Anweisung aus einer Tabelle oder Sicht übertragen werden. Die Daten können zwischen SQL Server und einer Betriebssystemdatendatei verschoben werden, z. B. eine ASCII-Datei. Datendateien können verschiedene Formate aufweisen. Das Format wird in einer Formatdatei definiert. Optional können die Daten in Programmvariablen geladen und mithilfe von Massenkopierfunktionen und -methoden in SQL Server übertragen werden.

Eine Beispielanwendung zur Veranschaulichung dieses Features finden Sie unter Massenkopieren von Daten mithilfe von IRowsetFastLoad (OLE DB).

Eine Anwendung verwendet Massenkopiervorgänge in der Regel in einer der folgenden Arten:

  • Massenkopieren aus einer Tabelle, Sicht oder dem Resultset einer Transact-SQL-Anweisung in eine Datendatei, in der die Daten im selben Format gespeichert werden wie in der Tabelle bzw. Sicht.

    Diese Datei wird als Datendatei im einheitlichen Modus bezeichnet.

  • Massenkopieren aus einer Tabelle, Sicht oder dem Resultset einer Transact-SQL-Anweisung in eine Datendatei, in der die Daten in einem anderen Format gespeichert werden als in der Tabelle bzw. Sicht.

    In diesem Fall wird eine separate Formatdatei erstellt, in der die Charakteristika (Datentyp, Position, Länge, Abschlusszeichen, usw.) der einzelnen, in der Datendatei zu speichernden Spalten definiert werden. Wenn alle Spalten in Zeichenformat konvertiert werden, wird die resultierende Datei als Datendatei im Zeichenmodus bezeichnet.

  • Massenkopieren aus einer Datendatei in eine Tabelle oder Sicht.

    Gegebenenfalls wird eine Formatdatei verwendet, um das Layout der Datendatei zu bestimmen.

  • Laden der Daten in Programmvariablen und anschließender Import der Daten in eine Tabelle oder Sicht unter Verwendung der Massenkopierfunktionen für das Massenkopieren von jeweils einer Zeile.

Datendateien, die von Massenkopierfunktionen verwendet werden, brauchen nicht von einem anderen Massenkopierprogramm erstellt worden sein. Beliebige andere Systeme können entsprechend den Massenkopierdefinitionen Datendateien und Formatdateien generieren. Diese Dateien können dann mit einem SQL Server-Massenkopierprogramm verwendet werden, um Daten in SQL Server zu importieren. Beispielsweise könnten Sie Daten aus einer Kalkulationstabelle in eine durch Tabstopps getrennte Datei exportieren, eine die durch Tabstopps getrennte Datei in einer Formatdatei beschreiben und schließlich mithilfe eines Massenkopierprogramms die Daten in SQL Server importieren. Datendateien, die mit einer Massenkopierfunktion generiert wurden, können auch in andere Anwendungen importiert werden. Beispielsweise könnten Sie Massenkopierfunktionen verwenden, um Daten aus einer Tabelle oder Sicht in eine durch Tabstopps getrennte Datei zu exportieren, die Sie dann in eine Kalkulationstabelle laden.

Programmierern von Anwendungen, die Massenkopierfunktionen verwenden, wird empfohlen, folgende allgemeine Regeln zu beachten, um die Leistung des Massenkopierens zu gewähren. Weitere Informationen zur Unterstützung von Massenladevorgängen in SQL Server finden Sie unter Massenimport und -export von Daten (SQL Server).

Einschränkungen

Ein CLR-benutzerdefinierter Typ (User Defined Type, UDT) muss als Binärdaten gebunden werden. Auch wenn eine Formatdatei SQLCHAR als Datentyp für eine Ziel-UDT-Spalte angibt, verarbeitet das BCP-Hilfsprogramm die Daten als Binärdaten.

SET FMTONLY OFF kann nicht mit Massenkopiervorgängen verwendet werden. SET FMTONLY OFF führt möglicherweise bei Massenkopiervorgängen zu unerwarteten Ergebnissen oder Fehlern.

SQL Server Native Client OLE DB-Anbieter

Der OLE DB-Anbieter von SQL Server Native Client implementiert zwei Methoden zum Ausführen von Massenkopievorgängen mit einer SQL Server-Datenbank. Bei der ersten Methode kommt die IRowsetFastLoad-Schnittstelle für speicherbasierte Massenkopiervorgänge zur Anwendung. Die zweite Methode stützt sich auf die IBCPSession-Schnittstelle für dateibasierte Massenkopiervorgänge.

Verwenden von speicherbasierten Massenkopiervorgängen

Der OLE DB-Anbieter von SQL Server Native Client implementiert die IRowsetFastLoad-Schnittstelle , um unterstützung für speicherbasierte Massenkopievorgänge von SQL Server verfügbar zu machen. Die IRowsetFastLoad-Schnittstelle implementiert die Methoden IRowsetFastLoad::Commit und IRowsetFastLoad::InsertRow.

Aktivieren einer Sitzung für IRowsetFastLoad

Der Consumer benachrichtigt den OLE DB-Anbieter von SQL Server Native Client über die Notwendigkeit einer Massenkopie, indem die anbieterspezifische SQL Server Native Client OLE DB-Eigenschaft SSPROP_ENABLEFASTLOAD auf VARIANT_TRUE festgelegt wird. Wenn die Eigenschaft für die Datenquelle festgelegt ist, erstellt der Consumer eine SQL Server Native Client OLE DB-Anbietersitzung. Die neue Sitzung lässt den Zugriff des Consumers auf die IRowsetFastLoad-Schnittstelle zu.

Hinweis

Wenn die IDataInitialize-Schnittstelle für die Initialisierung der Datenquelle verwendet wird, muss die SSPROP_IRowsetFastLoad-Eigenschaft im rgPropertySets-Parameter der IOpenRowset::OpenRowset-Methode festgelegt werden. Andernfalls gibt der Aufruf der OpenRowset-Methode E_NOINTERFACE zurück.

Das Aktivieren einer Sitzung für Massenkopien schränkt die UNTERSTÜTZUNG des OLE DB-Anbieters für SQL Server Native Client für Schnittstellen in der Sitzung ein. Eine Sitzung mit aktivierter Massenkopierfunktion bietet lediglich die folgenden Schnittstellen:

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

Um die Erstellung von Massenkopie-aktivierten Rowsets zu deaktivieren und die SQL Server Native Client OLE DB-Anbietersitzung auf die Standardverarbeitung zurückzusetzen, setzen Sie SSPROP_ENABLEFASTLOAD auf VARIANT_FALSE zurück.

IRowsetFastLoad Rowsets

Die Ole DB-Massenkopie-Rowsets des SQL Server Native Client-Anbieters sind schreibgeschützt, aber sie machen Schnittstellen verfügbar, die es dem Consumer ermöglichen, die Struktur einer SQL Server-Tabelle zu bestimmen. Die folgenden Schnittstellen werden in einem Massenkopie-aktivierten OLE DB-Anbieter-Rowset für SQL Server Native Client verfügbar gemacht:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Die anbieterspezifischen Eigenschaften SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS und SSPROP_FASTLOADKEEPIDENTITY Steuerelementverhalten eines OLE DB-Anbieters eines OLE DB-Anbieters mit Massenkopien von SQL Server. Die Eigenschaften werden im rgProperties-Element eines rgPropertySetsIOpenRowset-Parametermemmangegeben.

Eigenschafts-ID BESCHREIBUNG
SSPROP_FASTLOADKEEPIDENTITY Spalte: Nein

R/W: Lesen/Schreiben

Typ: VT_BOOL

Standardwert: VARIANT_FALSE

Beschreibung: Verwaltet vom Consumer angegebene Identitätswerte.

VARIANT_FALSE: Werte für eine Identitätsspalte in der SQL Server-Tabelle werden von SQL Server generiert. Jeder für die Spalte gebundene Wert wird vom OLE DB-Anbieter des SQL Server Native Client ignoriert.

VARIANT_TRUE: Der Consumer bindet einen Accessor, der einen Wert für eine SQL Server-Identitätsspalte bereitstellt. Die IDENTITY-Eigenschaft ist nicht für Spalten verfügbar, die NULL-Werte akzeptieren, daher stellt der Consumer für jeden IRowsetFastLoad::Insert-Aufruf einen eindeutigen Wert bereit.
SSPROP_FASTLOADKEEPNULLS Spalte: Nein

R/W: Lesen/Schreiben

Typ: VT_BOOL

Standardwert: VARIANT_FALSE

Beschreibung: Behält NULL-Werte für Spalten mit einer DEFAULT-Einschränkung bei. Betrifft nur SQL Server-Spalten, die NULL-Werte akzeptieren und eine DEFAULT-Einschränkung aufweisen.

VARIANT_FALSE: SQL Server fügt den Standardwert für die Spalte ein, wenn der SQL Server Native Client OLE DB-Anbieter eine Zeile einfügt, die NULL für die Spalte enthält.

VARIANT_TRUE: SQL Server fügt NULL für den Spaltenwert ein, wenn der SQL Server Native Client OLE DB-Anbieter eine Zeile einfügt, die NULL für die Spalte enthält.
SSPROP_FASTLOADOPTIONS Spalte: Nein

R/W: Lesen/Schreiben

Typ: VT_BSTR

Standardwert: keiner

Beschreibung: Diese Eigenschaft ist mit der -h "hint[,...n]"-Option des BCP-Hilfsprogramms identisch. Die folgende(n) Zeichenfolge(n) kann/können beim Massenkopieren von Daten in eine Tabelle optional verwendet werden.

ORDER(column[ASC | DESC][,...n]): Sortierreihenfolge der Daten in der Datendatei. Die Leistung des Massenkopierens wird verbessert, wenn die zu ladende Datendatei entsprechend dem gruppierten Index der Tabelle sortiert ist.

ROWS_PER_BATCH = bb: Die Anzahl von Datenzeilen pro Batch (als bb). Der Server optimiert das Massenladen entsprechend dem Wert von bb. Standardmäßig ist ROWS_PER_BATCH unbekannt.

KILOBYTES_PER_BATCH = cc: Anzahl von Kilobyte (KB) an Daten pro Batch (als „cc“). Standardmäßig ist KILOBYTES_PER_BATCH unbekannt.

TABLOCK: Für die Dauer des Massenimportvorgangs wird eine Sperre auf Tabellenebene aktiviert. Diese Option verbessert die Leistung beträchtlich, da weniger Sperrkonflikte für die Tabelle auftreten, wenn diese nur während des Massenkopiervorgangs gesperrt wird. Eine Tabelle kann gleichzeitig von mehreren Clients geladen werden, wenn die Tabelle keine Indizes aufweist und TABLOCK angegeben ist. Standardmäßig wird das Sperrverhalten durch die Tabellenoption table lock on bulk load bestimmt.

CHECK_CONSTRAINTS: Alle Einschränkungen fürtable_name werden während des Massenkopiervorgangs überprüft. Standardmäßig werden Einschränkungen ignoriert.

FIRE_TRIGGER: SQL Server verwendet die Zeilenversionsverwaltung für Trigger und speichert die Zeilenversionen im Versionsspeicher in tempdb. Deshalb sind Massenprotokollierungsoptimierungen verfügbar, auch wenn Trigger aktiviert sind. Bevor Sie einen Massenimport eines Batches mit einer großen Anzahl von Zeilen vornehmen, für die Trigger aktiviert sind, müssen Sie gegebenenfalls die Größe von tempdb erweitern.

Verwenden von dateibasierten Massenkopiervorgängen

Der OLE DB-Anbieter von SQL Server Native Client implementiert die IBCPSession-Schnittstelle , um Unterstützung für dateibasierte SQL Server-Massenkopievorgänge verfügbar zu machen. Die IBCPSession-Schnittstelle implementiert die IBCPSession::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPSession::BCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt, and IBCPSession::BCPWriteFmt-Methoden.

ODBC-Treiber für SQL Server Native Client

Der ODBC-Treiber für SQL Server Native Client verwaltet die gleiche Unterstützung für Massenkopievorgänge, die Teil früherer Versionen des SQL Server ODBC-Treibers waren. Informationen zu Massenkopievorgängen mithilfe des SQL Server Native Client ODBC-Treibers finden Sie unter Ausführen von Massenkopievorgängen (ODBC).For information about bulk copy operations using the SQL Server Native Client ODBC driver, see Performing Bulk Copy Operations (ODBC).

Weitere Informationen

SQL Server Native Client-Funktionen
Datenquelleneigenschaften (OLE DB)
Massenimport und -export von Daten (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
Optimieren der Leistung des Massenimports