Durchführen von Massenkopiervorgängen

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.

CodePlex hat eine Beispielanwendung, die diese Funktion veranschaulicht; weitere Informationen finden Sie unter Beispiele für SQL Server Database Engine. Eine Anwendung verwendet in der Regel Massenkopieren auf eine 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 systemeigenen 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.

HinweisHinweis

Ab SQL Server 2005 meldet der Server einen Fehler, wenn Sie das bcp-Hilfsprogramm verwenden und numerische Daten abgeschnitten werden. In SQL Server 2000 und niedrigeren Versionen werden nur Warnungen zurückgegeben. Dies könnte Probleme in vorhandenen Anwendungen verursachen, die die Warnung ignorieren. Diese Probleme können vermieden werden, indem Sie sicherstellen, dass die Eingabedaten korrekte Werte aufweisen, die nicht abgeschnitten werden, oder indem Sie weiterhin die SQL Server 2000-Version von bcp verwenden.

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 Massenkopiervorgängen in SQL Server finden Sie unter Informationen zu Massenimport- und Massenexportvorgängen.

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 SQL Server Native Client-OLE DB-Anbieter implementiert zwei Methoden zum Ausführen von Massenkopiervorgä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 SQL Server Native Client-OLE DB-Anbieter implementiert die IRowsetFastLoad-Schnittstelle, um die Unterstützung für SQL Server speicherbasierte Massenkopiervorgänge 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 SQL Server Native Client-OLE DB-Anbieter, dass ein Massenkopiervorgang erforderlich ist, indem er für die SSPROP_ENABLEFASTLOAD-Eigenschaft, die für den systemeigenen SQL Server Client-OLE DB-Anbieter spezifisch ist, VARIANT_TRUE festlegt. Wenn die Datenquelle für die Eigenschaft festgelegt wurde, 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.

HinweisHinweis

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 zum Massenkopieren schränkt die Unterstützung des SQL Server Native Client-OLE DB-Anbieters für Schnittstellen in dieser Sitzung ein. Eine Sitzung mit aktivierter Massenkopierfunktion bietet lediglich die folgenden Schnittstellen:

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

Um die Erstellung massenkopierter Rowsets zu deaktivieren und die SQL Server Native Client-OLE DB-Anbietersitzung auf die Standardverarbeitungsweise zurückzusetzen, legen Sie für SSPROP_ENABLEFASTLOAD den Parameter VARIANT_FALSE fest.

IRowsetFastLoad Rowsets

Die massenkopierten Rowsets im SQL Server Native Client-OLE DB-Anbieter weisen nur Schreibzugriff auf, machen jedoch Schnittstellen verfügbar, die dem Consumer ermöglichen, die Struktur einer SQL Server-Tabelle zu bestimmen. Die folgenden Schnittstellen sind in SQL Server Native Client-OLE DB-Anbieterrowsets verfügbar, in denen die Massenkopierfunktion aktiviert ist:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Die anbieterspezifischen Eigenschaften SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS und SSPROP_FASTLOADKEEPIDENTITY steuern die Verhalten des Massenkopierrowsets eines SQL Server Native Client-OLE DB-Anbieters. Die Eigenschaften werden im rgProperties-Element eines rgPropertySets-IOpenRowset -Parameterelements angegeben.

Eigenschafts-ID

Beschreibung

SSPROP_FASTLOADKEEPIDENTITY

Spalte: No

R/W: Lesen/Schreiben

Typ: VT_BOOL

Standard: VARIANT_FALSE

Beschreibung: Verwaltet vom Consumer angegebene Identitätswerte.

VARIANT_FALSE: Werte für eine Identitätsspalte in der Tabelle SQL Server werden von SQL Server generiert. Alle für die Spalte gebundenen Werte werden vom SQL Server Native Client-OLE DB-Anbieter 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 einen eindeutigen Wert für jeden IRowsetFastLoad::Insert-Aufruf.

SSPROP_FASTLOADKEEPNULLS

Spalte: No

R/W: Lesen/Schreiben

Typ: VT_BOOL

Standard: 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 Consumer des SQL Server Native Client-OLE DB-Anbieters eine Zeile einfügt, die einen NULL-Wert für die Spalte enthält.

VARIANT_TRUE: SQL Server fügt einen NULL-Wert in die Spalte ein, wenn der Consumer des SQL Server Native Client-OLE DB-Anbieters eine Zeile einfügt, die einen NULL-Wert für die Spalte enthält.

SSPROP_FASTLOADOPTIONS

Spalte: No

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(Spalte[ ASC |DESC] [...n]): Sortierreihenfolge nach 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: Anzahl der 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: Gibt die ungefähre Datenmenge pro Batch in KB an (als cc). Standardmäßig ist KILOBYTES_PER_BATCH unbekannt.

TABLOCK: Eine Sperre auf Tabellenebene wird für die Dauer des Massenimportvorgangs 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ür tabellenname werden während des Massenkopiervorgangs überprüft. Standardmäßig werden Einschränkungen ignoriert.

FIRE_TRIGGER: Wenn in SQL Server 2000 Trigger aktiviert waren, konnte die optimierte Protokollierung nicht ausgeführt werden, da die Triggerlogik auf Protokolldatensätzen beruhte. Während eines Massenimportvorgangs mit aktivierten Triggern wurden alle Massenprotokollierungsoptimierungen (einschließlich der Massenaktualisierungssperren) deaktiviert.

Ab SQL Server 2005 verwendet SQL Server für Trigger die Zeilenversionsverwaltung und speichern 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 SQL Server Client-OLE DB-Anbieter implementiert die IBCPSession-Schnittstelle, um die Unterstützung für SQL Server dateibasierte Massenkopiervorgänge verfügbar zu machen. Die IBCPSession-Schnittstelle implementiert die folgenden Methoden: IBCPSession::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPDone, IBCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt, und IBCPSession::BCPWriteFmt.

SQL Server Native Client-ODBC-Treiber

Der SQL Server Native Client-ODBC-Treiber unterstützt Massenkopiervorgänge in derselben Weise wie in Vorgängerversionen SQL Server des ODBC-Treibers. Weitere Informationen über Massenkopiervorgänge unter Verwendung des SQL Server Native Client-ODBC-Treibers finden Sie unter Durchführen von Massenkopiervorgängen (ODBC).