Freigeben über


BULK INSERT (Transact-SQL)

Importiert eine Datendatei in eine Datenbanktabelle oder Sicht und verwendet dabei ein vom Benutzer angegebenes Format.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

BULK INSERT 
   [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] 
      FROM 'data_file' 
     [ WITH 
    ( 
   [ [ , ] BATCHSIZE = batch_size ] 
   [ [ , ] CHECK_CONSTRAINTS ] 
   [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] 
   [ [ , ] DATAFILETYPE = 
      { 'char' | 'native'| 'widechar' | 'widenative' } ] 
   [ [ , ] FIELDTERMINATOR = 'field_terminator' ] 
   [ [ , ] FIRSTROW = first_row ] 
   [ [ , ] FIRE_TRIGGERS ] 
   [ [ , ] FORMATFILE = 'format_file_path' ] 
   [ [ , ] KEEPIDENTITY ] 
   [ [ , ] KEEPNULLS ] 
   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] 
   [ [ , ] LASTROW = last_row ] 
   [ [ , ] MAXERRORS = max_errors ] 
   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] 
   [ [ , ] ROWS_PER_BATCH = rows_per_batch ] 
   [ [ , ] ROWTERMINATOR = 'row_terminator' ] 
   [ [ , ] TABLOCK ] 
   [ [ , ] ERRORFILE = 'file_name' ] 
    )] 

Argumente

  • database_name
    Der Name der Datenbank, in der sich die angegebene Tabelle oder Sicht befindet. Fehlt die Angabe, ist dies die aktuelle Datenbank.

  • schema_name
    Der Name der Tabelle oder des Sichtschemas. schema_name ist optional, wenn das Standardschema des Benutzers, der den Massenimportvorgang ausführt, das Schema der angegebenen Tabelle oder Sicht ist. Wenn schema nicht angegeben wird und es sich bei dem Standardschema des Benutzers, der den Massenimportvorgang ausführt, nicht um das Schema der angegebenen Tabelle oder Sicht handelt, wird in SQL Server eine Fehlermeldung zurückgegeben, und der Massenimportvorgang wird abgebrochen.

  • table_name
    Der Name der Tabelle oder Sicht, in die der Massenimport von Daten erfolgen sollen. Es können nur Sichten verwendet werden, deren Spalten alle auf dieselbe Basistabelle verweisen. Weitere Informationen zu den Einschränkungen beim Laden von Daten in Sichten finden Sie unter INSERT (Transact-SQL).

  • ' data_file '
    Der vollständige Pfad der Datendatei mit den Daten, die in die angegebene Tabelle oder Sicht importiert werden sollen. BULK INSERT kann Daten von einem Datenträger importieren, einschließlich eines Netzwerks, einer Diskette, einer Festplatte usw.

    Für data_file muss ein gültiger Pfad auf dem Server, auf dem SQL Server ausgeführt wird, angegeben werden. Wenn data_file eine Remotedatei ist, geben Sie den UNC-Namen (Universal Naming Convention) an. Ein UNC-Name weist folgendes Format auf: \\Systemname\ShareName\Path\FileName. Beispiel: \\SystemX\DiskZ\Sales\update.txt.

  • BATCHSIZE **=**batch_size
    Gibt die Anzahl von Zeilen in einem Batch an. Jeder Batch wird als eine Transaktion auf den Server kopiert. Falls ein Fehler erzeugt wird, führt SQL Server für die Transaktion jedes Batches ein Commit oder Rollback aus. Standardmäßig werden alle Daten, die sich in der angegebenen Datendatei befinden, als ein Batch behandelt. Informationen zu Leistungsaspekten finden Sie unter "Hinweise" weiter unten in diesem Thema.

  • CHECK_CONSTRAINTS
    Gibt an, dass alle Einschränkungen, die für die Zieltabelle oder -sicht gelten, während des Massenimportvorgangs überprüft werden müssen. Ohne die Option CHECK_CONSTRAINTS werden alle CHECK- und FOREIGN KEY-Einschränkungen ignoriert, und nach Abschluss des Vorgangs wird die Einschränkung in der Tabelle als nicht vertrauenswürdig gekennzeichnet.

    HinweisHinweis

    UNIQUE- und PRIMARY KEY-Einschränkungen werden immer erzwungen. Beim Importieren in eine Zeichenspalte, die mit einer NOT NULL-Einschränkung definiert ist, fügt BULK INSERT eine leere Zeichenfolge ein, wenn die Textdatei keinen Wert enthält.

    An gewissen Punkten müssen Sie die Einschränkungen in der gesamten Tabelle überprüfen. Wenn die Tabelle vor dem Massenimportvorgang nicht leer war, kann der Aufwand einer erneuten Überprüfung der Einschränkung höher sein als das Anwenden von CHECK-Einschränkungen auf die inkrementellen Daten.

    Möglicherweise möchten Sie Einschränkungen deaktivieren (das Standardverhalten), wenn die Eingabedaten Zeilen enthalten, die die Einschränkungen verletzen. Wenn CHECK-Einschränkungen deaktiviert sind, können Sie die Daten importieren und dann Transact-SQL-Anweisungen verwenden, um die ungültigen Daten zu entfernen.

    HinweisHinweis

    Die Option MAXERRORS kann zur Einschränkungsüberprüfung nicht verwendet werden.

    HinweisHinweis

    In SQL Server 2005 und höheren Versionen erzwingt BULK INSERT neue Datenüberprüfungen, die möglicherweise zum Fehlschlagen vorhandener Skripts führen, wenn diese für ungültige Daten in einer Datendatei ausgeführt werden.

  • CODEPAGE = { **'**ACP '| **'**OEM '| **'**RAW '| 'code_page' }
    Gibt die Codepage für die in der Datendatei enthaltenen Daten an. CODEPAGE ist nur dann von Bedeutung, wenn die Daten Spalten vom Typ char, varchar oder text mit Zeichenwerten enthalten, die größer als 127 oder kleiner als 32 sind.

    HinweisHinweis

    Microsoft empfiehlt, für jede Spalte einen Sortierungsnamen in einer Formatdatei anzugeben.

    CODEPAGE-Wert

    Beschreibung

    ACP

    Spalten vom Datentyp char, varchar oder text werden von der ANSI/Microsoft Windows-Codepage (ISO 1252) in die SQL Server-Codepage konvertiert.

    OEM (Standard)

    Spalten vom Datentyp char, varchar oder text werden von der OEM-Codepage des Systems in die SQL Server-Codepage konvertiert.

    RAW

    Dies ist die schnellste Option, da keine Konvertierung von einer Codepage in eine andere erfolgt.

    code_page

    Bestimmte Codepagenummer, z. B. 850.

    Wichtiger HinweisWichtig

    SQL Server unterstützt nicht Codepage 65001 (UTF-8-Codierung).

  • DATAFILETYPE = { 'char' | 'native' | 'widechar' | 'widenative' }
    Gibt an, dass BULK INSERT den Importvorgang mithilfe des angegebenen DATAFILETYPE-Werts ausführt.

    DATAFILETYPE-Wert

    Alle Daten, die dargestellt sind in:

    char (Standard)

    Zeichenformat

    Weitere Informationen finden Sie unter Verwenden des Zeichenformats zum Importieren und Exportieren von Daten (SQL Server).

    Systemeigen

    Systemeigene (Datenbank-) Datentypen. Erstellen Sie die systemeigene Datendatei durch das Massenimportieren von Daten aus SQL Server mithilfe des Hilfsprogramms bcp.

    Der Wert native bietet eine höhere Leistung als der Wert char.

    Weitere Informationen finden Sie unter Verwenden des systemeigenen Formats zum Importieren oder Exportieren von Daten (SQL Server).

    widechar

    Unicode-Zeichen

    Weitere Informationen finden Sie unter Verwenden des Unicode-Zeichenformats zum Importieren und Exportieren von Daten (SQL Server).

    widenative

    Systemeigene (Datenbank-) Datentypen, außer in Spalten vom Typ char, varchar und text, in denen Daten im Unicode-Format gespeichert werden. Erstellen Sie die Datendatei widenative durch das Massenimportieren von Daten aus SQL Server mithilfe des Hilfsprogramms bcp.

    Der Wert vom Datentyp widenative bietet eine höhere Leistung als der widechar-Wert. Falls die Datendatei erweiterte ANSI-Zeichen enthält, geben Sie widenative an.

    Weitere Informationen finden Sie unter Verwenden des systemeigenen Unicode-Formats zum Importieren oder Exportieren von Daten (SQL Server).

  • FIELDTERMINATOR ='field_terminator'
    Gibt das Feldabschlusszeichen an, das für Datendateien vom Typ char und widechar verwendet werden soll. Standardmäßig wird \t (Tabstoppzeichen) als Feldabschlusszeichen verwendet. Weitere Informationen finden Sie unter Angeben von Feld- und Zeilenabschlusszeichen (SQL Server).

  • FIRSTROW **=**first_row
    Gibt die Nummer der ersten zu ladenden Zeile an. In der Standardeinstellung ist dies die erste Zeile in der angegebenen Datendatei. FIRSTROW ist einsbasiert.

    HinweisHinweis

    Es ist nicht vorgesehen, dass das FIRSTROW-Attribut Spaltenheader überspringt. Header zu überspringen wird von der BULK INSERT-Anweisung nicht unterstützt. Wenn Zeilen ausgelassen werden, werden von SQL Server Database Engine (Datenbankmodul) nur die Feldabschlusszeichen berücksichtigt und die Daten in den Feldern von ausgelassenen Zeilen nicht überprüft.

  • FIRE_TRIGGERS
    Gibt an, dass INSERT-Trigger, die für die Zieltabelle definiert sind, während des Massenimportvorgangs ausgeführt werden. Falls Trigger für INSERT-Vorgänge in der Zieltabelle definiert sind, werden sie für jeden abgeschlossenen Batch ausgelöst.

    Wenn FIRE_TRIGGERS nicht angegeben ist, werden keine INSERT-Trigger ausgeführt.

  • FORMATFILE ='format_file_path'
    Gibt den vollständigen Pfad einer Formatdatei an. Eine Formatdatei beschreibt die Datendatei, die gespeicherte Antworten enthält. Diese Antworten wurden mithilfe des Hilfsprogramms bcp für die gleiche Tabelle oder Sicht erstellt. Die Formatdatei muss verwendet werden, wenn Folgendes zutrifft:

    • Die Datendatei enthält größere oder weniger Spalten als die Tabelle oder Sicht.

    • Die Spalten befinden sich in einer unterschiedlichen Reihenfolge.

    • Die Spaltentrennzeichen variieren.

    • Es liegen andere Änderungen im Datenformat vor. Formatdateien werden in der Regel mit dem Hilfsprogramm bcp erstellt und nach Bedarf mit einem Text-Editor geändert. Weitere Informationen finden Sie unter bcp (Hilfsprogramm).

  • KEEPIDENTITY
    Gibt an, dass Identitätswerte in der importierten Datendatei für die Identitätsspalte verwendet werden müssen. Wird KEEPIDENTITY nicht angegeben, werden die Identitätswerte für diese Spalte zwar überprüft, jedoch nicht importiert. SQL Server weist dann auf der Basis von Ausgangswerten und inkrementellen Werten, die beim Erstellen der Tabelle angegeben wurden, eindeutige Werte zu. Wenn die Datendatei keine Werte für die Identitätsspalte in der Tabelle oder Sicht enthält, geben Sie mithilfe einer Formatdatei an, dass die Identitätsspalte der Tabelle oder Sicht beim Importieren von Daten ausgelassen werden soll. SQL Server weist der Spalte automatisch eindeutige Werte zu. Weitere Informationen finden Sie unter DBCC CHECKIDENT (Transact-SQL).

    Weitere Informationen zum Beibehalten von Identitätswerten finden Sie unter Beibehalten von Identitätswerten beim Massenimport von Daten (SQL Server).

  • KEEPNULLS
    Gibt an, dass in leere Spalten während des Massenimportvorgangs keine Standardwerte eingefügt, sondern ein NULL-Wert für diese Spalten beibehalten werden soll. Weitere Informationen finden Sie unter Beibehalten von NULL-Werten oder Verwenden von Standardwerten während des Massenimports (SQL Server).

  • KILOBYTES_PER_BATCH = kilobytes_per_batch
    Gibt die ungefähre Datenmenge pro Batch in KB als kilobytes_per_batch an. In der Standardeinstellung ist KILOBYTES_PER_BATCH unbekannt. Informationen zu Leistungsaspekten finden Sie unter "Hinweise" weiter unten in diesem Thema.

  • LASTROW**=**last_row
    Gibt die Nummer der letzten zu ladenden Zeile an. Der Standardwert ist 0, wodurch die Daten bis zur letzten Zeile in der angegebenen Datendatei geladen werden.

  • MAXERRORS = max_errors
    Gibt die maximale Anzahl von Syntaxfehlern an, die in den Daten zulässig sind, bevor der Massenimportvorgang abgebrochen wird. Jede Zeile, die beim Massenimportvorgang nicht importiert werden kann, wird ignoriert und zählt dabei als ein Fehler. Wenn max_errors nicht angegeben ist, wird der Standardwert 10 verwendet.

    HinweisHinweis

    Die Option MAX_ERRORS kann nicht zur Einschränkungsüberprüfung oder zum Konvertieren der Datentypen money und bigint verwendet werden.

  • ORDER ( { column [ ASC | DESC ] } [ ,... n ] )
    Gibt die Vorgehensweise beim Sortieren der Daten in der Datendatei an. Die Leistung des Massenimportierens wird verbessert, wenn die zu importierenden Daten entsprechend dem gruppierten Index der Tabelle sortiert sind (wenn zutreffend). Wenn die Datendatei in einer anderen Reihenfolge sortiert wird, die von der Reihenfolge eines Schlüssels des gruppierten Indexes abweicht, oder die Tabelle keinen gruppierten Index hat, wird die ORDER-Klausel ignoriert. Die angegebenen Namen der Spalten müssen gültige Spaltennamen in der Zieltabelle sein. Standardmäßig geht der Masseneinfügevorgang davon aus, dass die Datendatei nicht sortiert ist. Für die Optimierung des Massenimportvorgangs wird von SQL Server auch überprüft, ob die importierten Daten sortiert sind.

  • n
    Ein Platzhalter, der anzeigt, dass mehrere Spalten angegeben werden können.

  • ROWS_PER_BATCH **=**rows_per_batch
    Gibt die ungefähre Anzahl von Datenzeilen in der Datendatei an.

    Standardmäßig werden alle Daten in der Datendatei als einzelne Transaktion an den Server gesendet, und die Anzahl von Zeilen im Batch ist dem Abfrageoptimierer nicht bekannt. Wenn Sie ROWS_PER_BATCH (mit einem Wert > 0) angeben, verwendet der Server diesen Wert, um den Massenimportvorgang zu optimieren. Der für ROWS_PER_BATCH angegebene Wert sollte etwa der tatsächlichen Zeilenanzahl entsprechen. Informationen zu Leistungsaspekten finden Sie unter "Hinweise" weiter unten in diesem Thema.

  • ROWTERMINATOR ='row_terminator'
    Gibt das Zeilenabschlusszeichen an, das für char- und widechar-Datendateien verwendet werden soll. Standardmäßig wird \r\n (Neue-Zeile-Zeichen) als Zeilenabschlusszeichen verwendet. Weitere Informationen finden Sie unter Angeben von Feld- und Zeilenabschlusszeichen (SQL Server).

  • TABLOCK
    Gibt an, dass eine Sperre auf Tabellenebene für die Dauer des Massenimportvorgangs aktiviert 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. Da weniger Sperrkonflikte in der Tabelle auftreten, wenn diese während des Massenimportvorgangs gesperrt wird, verbessert sich in manchen Fällen die Leistung erheblich. Informationen zu Leistungsaspekten finden Sie unter "Hinweise" weiter unten in diesem Thema.

  • ERRORFILE ='file_name'
    Gibt die Datei an, die zum Sammeln der Zeilen verwendet wird, die Formatierungsfehler enthalten und nicht in ein OLE DB-Rowset konvertiert werden können. Diese Zeilen werden aus der Datendatei unverändert in diese Fehlerdatei kopiert.

    Die Fehlerdatei wird bei Ausführung des Befehls erstellt. Falls die Datei bereits vorhanden ist, tritt ein Fehler auf. Darüber hinaus wird eine Kontrolldatei mit der Erweiterung .ERROR.txt erstellt. Diese Datei enthält einen Verweis auf jede Zeile in der Fehlerdatei und stellt eine Fehlerdiagnose bereit. Sobald die Fehler korrigiert wurden, können die Daten geladen werden.

Kompatibilität

BULK INSERT erzwingt strenge Datenüberprüfungen für die aus einer Datei gelesenen Daten, die möglicherweise zum Fehlschlagen vorhandener Skripts führen können, wenn diese für ungültige Daten in einer Datendatei ausgeführt werden. BULK INSERT überprüft beispielsweise Folgendes:

  • Die einheitliche Darstellung der Datentypen float oder real ist gültig.

  • Unicode-Daten besitzen eine gerade Bytelänge.

Datentypen

Konvertierungen von Zeichenfolgen- in Dezimaldatentypen

Die in BULK INSERT-Vorgängen verwendeten Konvertierungen von Zeichenfolgen- in Dezimaldatentypen folgen denselben Regeln wie die Transact-SQL-CONVERT-Funktion insofern, als Zeichenfolgen mit numerischen Werten in wissenschaftlicher Schreibweise nicht akzeptiert werden. Daher behandelt BULK INSERT diese Zeichenfolgen als ungültige Werte und meldet Konvertierungsfehler.

Um dieses Verhalten zu umgehen, verwenden Sie eine Formatdatei zum Massenimport von float-Daten in wissenschaftlicher Schreibweise in Spalten im Dezimalformat. Beschreiben Sie in der Formatdatei diese Spalte explizit als vom Datentyp real oder float. Weitere Informationen zu diesen Datentypen finden Sie unter float und real (Transact-SQL).

HinweisHinweis

Formatdateien stellen real-Daten als SQLFLT4-Datentyp und float-Daten als SQLFLT8-Datentyp dar. Informationen zu Nicht-XML-Formatdateien finden Sie unter Angeben des Dateispeichertyps mithilfe von bcp (SQL Server).

Beispiel: Importieren eines numerischen Werts in wissenschaftlicher Schreibweise

In diesem Beispiel wird die folgende Tabelle verwendet:

CREATE TABLE t_float(c1 float, c2 decimal (5,4))

Der Benutzer möchte nun per Massenimport Daten in die t_float-Tabelle kopieren. Die Datendatei C:\t_float-c.dat enthält float-Daten in wissenschaftlicher Schreibweise, wie zum Beispiel:

8.0000000000000002E-28.0000000000000002E-2

Diese Daten können jedoch mithilfe von BULK INSERT nicht direkt in die t_float-Tabelle importiert werden, da die zweite Spalte der Tabelle, c2, den decimal-Datentyp verwendet. Daher ist eine Formatdatei erforderlich. In der Formatdatei müssen die float-Daten in wissenschaftlichem Format dem Dezimalformat der Spalte c2 zugeordnet werden.

Die folgende Formatdatei verwendet den SQLFLT8-Datentyp, um der zweiten Spalte das zweite Datenfeld zuzuordnen:

<?xml version="1.0"?>

<BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<RECORD>

<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30"/>

<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30"/> </RECORD> <ROW>

<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8"/>

<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8"/> </ROW> </BCPFORMAT>

Geben Sie die folgende Transact-SQL-Anweisung aus, und verwenden Sie dabei für diese Formatdatei den Dateinamen C:\t_floatformat-c-xml.xml, damit die Testdaten in die Testtabelle importiert werden:

BULK INSERT bulktest..t_float
FROM 'C:\t_float-c.dat' WITH (FORMATFILE='C:\t_floatformat-c-xml.xml');
GO

Datentypen für den Massenexport bzw. -import von SQLXML-Dokumenten

Verwenden Sie in der Formatdatei einen der folgenden Datentypen für den Massenexport oder -import von SQLXML-Daten:

Datentyp

Wirkung

SQLCHAR oder SQLVARCHAR

Die Daten werden in der Clientcodepage oder in der Codepage, die durch die Sortierung impliziert wird, gesendet. Damit wird dieselbe Wirkung erzielt wie mit der Angabe von DATAFILETYPE = 'char' ohne Formatdatei.

SQLNCHAR oder SQLNVARCHAR

Die Daten werden als Unicode-Daten gesendet. Damit wird dieselbe Wirkung erzielt wie mit der Angabe von DATAFILETYPE = 'widechar' ohne Formatdatei.

SQLBINARY oder SQLVARBIN

Die Daten werden ohne Konvertierung gesendet.

Allgemeine Hinweise

Einen Vergleich der BULK INSERT-Anweisung, der INSERT ... SELECT * FROM OPENROWSET(BULK...)-Anweisung und dem bcp-Befehl finden Sie unter Massenimport und -export von Daten (SQL Server).

Informationen zum Vorbereiten von Daten für den Massenimport finden Sie unter Vorbereiten von Daten für den Massenexport oder -import (SQL Server).

Die BULK INSERT-Anweisung kann innerhalb einer benutzerdefinierten Transaktion ausgeführt werden, um Daten in eine Tabelle oder eine Sicht zu importieren. Damit mehrere Übereinstimmungen für den Massenimport von Daten verwendet werden, kann in einer Transaktion optional die BATCHSIZE-Klausel in der BULK INSERT-Anweisung angegeben werden. Wenn ein Rollback für eine Transaktion mit mehreren Batches ausgeführt wird, wird für jeden Batch, der bei der Transaktion an SQL Server gesendet wurde, ein Rollback ausgeführt.

Interoperabilität

Importieren von Daten aus einer CSV-Datei

CSV (Comma-Separated Value)-Dateien werden von SQL Server-Massenimportvorgängen nicht unterstützt. In manchen Fällen kann jedoch eine CSV-Datei als Datendatei für einen Massenimport von Daten in SQL Server verwendet werden. Informationen zu den Anforderungen zum Importieren von Daten aus einer CSV-Datendatei finden Sie unter Vorbereiten von Daten für den Massenexport oder -import (SQL Server).

Protokollierungsverhalten

Informationen dazu, wann Zeileneinfügevorgänge, die durch den Massenimport ausgeführt werden, im Transaktionsprotokoll protokolliert werden, finden Sie unter Voraussetzungen für die minimale Protokollierung beim Massenimport.

Einschränkungen

Bei Verwendung einer Formatdatei mit BULK INSERT können maximal 1024 Felder angegeben werden. Dieser Höchstwert entspricht der maximalen Zahl zulässiger Spalten in einer Tabelle. Wenn Sie BULK INSERT mit einer Datendatei verwenden, in der mehr als 1024 Felder enthalten sind, generiert BULK INSERT den Fehler 4822. Das bcp-Hilfsprogramm unterliegt dieser Einschränkung nicht. Verwenden Sie deshalb für Datendateien mit mehr als 1024 Feldern den bcp-Befehl.

Leistungsaspekte

Wenn die Anzahl der in einem einzelnen Batch geleerten Seiten einen internen Schwellenwert überschreitet, könnte ein vollständiger Scan des Pufferpools ausgeführt werden, um die zu leerenden Seiten bei der Durchführung eines Commits für den Batch zu identifizieren. Dieser vollständige Scan kann sich negativ auf die Massenimportleistung auswirken. Die Überschreitung des internen Schwellenwerts ist wahrscheinlich, wenn ein großer Pufferpool mit einem langsamen E/A-Subsystem kombiniert wird. Um Pufferüberläufe auf großen Computern zu vermeiden, verwenden Sie entweder keinen TABLOCK-Hinweis (da dieser die Massenoptimierungen entfernt), oder verwenden Sie eine kleinere Batchgröße (die die Massenoptimierungen beibehält).

Da Computer unterschiedlich sind, wird empfohlen, verschiedene Batchgrößen mit den geladenen Daten zu testen, um die optimale Vorgehensweise zu bestimmen.

Sicherheit

Delegierung von Sicherheitskonten (Identitätswechsel)

Wenn ein Benutzer einen SQL Server-Anmeldenamen verwendet, wird das Sicherheitsprofil des SQL Server-Prozesskontos verwendet. Ein Anmeldename, für den die SQL Server-Authentifizierung verwendet wird, kann nicht außerhalb des Datenbankmoduls authentifiziert werden. Wenn ein BULK INSERT-Befehl durch einen Anmeldenamen initiiert wird, der die SQL Server-Authentifizierung verwendet, wird die Datenverbindung folglich mithilfe des Sicherheitskontexts des SQL Server-Prozesskontos (dem vom SQL Server-Datenbankmoduldienst verwendeten Konto) hergestellt. Um die Quelldaten lesen zu können, müssen Sie dem vom SQL Server-Datenbankmodul verwendeten Konto Zugriff auf die Quelldaten gewähren. Wenn sich hingegen ein SQL Server-Benutzer mithilfe der Windows-Authentifizierung anmeldet, können von diesem Benutzer nur die Dateien gelesen werden, auf die über das Benutzerkonto zugegriffen werden kann. Das Sicherheitsprofil des SQL Server-Prozesses wird dabei nicht berücksichtigt.

Wenn die BULK INSERT-Anweisung mit sqlcmd oder osql auf einem Computer ausgeführt wird, um Daten in SQL Server auf einem zweiten Computer einzufügen, und data_file auf einem dritten Computer mithilfe eines UNC-Pfads angegeben wird, kann der Fehler 4861 ausgegeben werden.

Verwenden Sie die SQL Server-Authentifizierung, um diesen Fehler zu beheben, und geben Sie einen SQL Server-Anmeldenamen an, der das Sicherheitsprofil des SQL Server-Prozesskontos verwendet, oder konfigurieren Sie Windows so, dass die Delegierung von Sicherheitskonten aktiviert ist. Informationen zum Aktivieren der Delegierung für Benutzerkonten finden Sie in der Windows-Hilfe.

Weitere Informationen zu diesem und anderen Sicherheitsaspekten bezüglich der Verwendung von BULK INSERT finden Sie unter Importieren von Massendaten mithilfe von BULK INSERT oder OPENROWSET(BULK...) (SQL Server).

Berechtigungen

Erfordert die Berechtigungen INSERT und ADMINISTER BULK OPERATIONS. Darüber hinaus ist die ALTER TABLE-Berechtigung erforderlich, wenn mindestens eine der folgenden Bedingungen zutrifft:

  • Es sind Einschränkungen vorhanden, und die Option CHECK_CONSTRAINTS ist nicht angegeben.

    HinweisHinweis

    Das Deaktivieren von Einschränkungen entspricht dem Standardverhalten. Verwenden Sie die Option CHECK_CONSTRAINTS, um Einschränkungen explizit zu überprüfen.

  • Es sind Trigger vorhanden, und die Option FIRE_TRIGGER ist nicht angegeben.

    HinweisHinweis

    Standardmäßig werden Trigger nicht ausgelöst. Verwenden Sie die Option FIRE_TRIGGER, um Trigger explizit auszulösen.

  • Importieren Sie Identitätswerte mithilfe der Option KEEPIDENTITY aus Datendateien.

Beispiele

A.Verwenden von |-Zeichen zum Importieren von Daten aus einer Datei

Im folgenden Beispiel werden Bestellinformationen aus der angegebenen Datendatei in die AdventureWorks.Sales.SalesOrderDetail-Tabelle importiert, wobei der senkrechte Strich (|) als Feldabschlusszeichen und |\n als Zeilenabschlusszeichen verwendet wird.

BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
   FROM 'f:\orders\lineitem.tbl'
   WITH 
      (
         FIELDTERMINATOR =' |',
         ROWTERMINATOR =' |\n'
      );

B.Verwenden des FIRE_TRIGGERS-Arguments

Im folgenden Beispiel wird das FIRE_TRIGGERS-Argument angegeben.

BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
   FROM 'f:\orders\lineitem.tbl'
   WITH
     (
        FIELDTERMINATOR =' |',
        ROWTERMINATOR = ':\n',
        FIRE_TRIGGERS
      );

C.Verwenden des Zeilenvorschubs als Zeilenabschlusszeichen

Im folgenden Beispiel wird eine Datei importiert, in der der Zeilenvorschub als ein Zeilenabschlusszeichen verwendet wird, z. B. eine UNIX-Ausgabe:

DECLARE @bulk_cmd varchar(1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>'' 
WITH (ROWTERMINATOR = '''+CHAR(10)+''')';
EXEC(@bulk_cmd);
HinweisHinweis

Abhängig davon, wie Textdateien von Microsoft Windows behandelt werden, wird (\n automatisch durch \r\n) ersetzt.

Zusätzliche Beispiele

Weitere Beispiele für BULK INSERT finden Sie in den folgenden Themen:

Siehe auch

Verweis

bcp (Hilfsprogramm)

INSERT (Transact-SQL)

OPENROWSET (Transact-SQL)

sp_tableoption (Transact-SQL)

Konzepte

Massenimport und -export von Daten (SQL Server)

Formatdateien zum Importieren oder Exportieren von Daten (SQL Server)

Vorbereiten von Daten für den Massenexport oder -import (SQL Server)