Freigeben über


BULK INSERT (Transact-SQL)

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

Gilt für: SQL Server (SQL Server 2008 bis aktuelle Version).

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.

    Hinweis

    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.

    Hinweis

    Die Option MAXERRORS kann zur Einschränkungsüberprüfung nicht verwendet 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.

    Hinweis

    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.

    Wichtig

    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.

      Hinweis

      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.

      Hinweis

      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).

    Hinweis

    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 eine SQL Server-Anmeldung verwendet, wird das Sicherheitsprofil des SQL Server-Prozesskontos verwendet. Eine Anmeldung mit der SQL Server-Authentifizierung kann nicht außerhalb des Datenbankmoduls authentifiziert werden. Wenn ein BULK INSERT-Befehl durch eine Anmeldung mit SQL Server-Authentifizierung initiiert wird, wird die Datenverbindung daher über den Sicherheitskontext des SQL Server-Prozesskontos hergestellt (das vom SQL Server-Datenbankmoduldienst verwendete Konto). Zum erfolgreichen Lesen der Quelldaten müssen Sie dem Konto, das vom SQL Server-Datenbankmodul verwendet wird, 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.

    Beim Ausführen der BULK INSERT-Anweisung mit sqlcmd oder osql auf einem Computer, um Daten in SQL Server auf einem zweiten Computer einzufügen, und beim Angeben von data_file auf einem dritten Computer mithilfe eines UNC-Pfades wird möglicherweise der Fehler 4861 ausgegeben.

    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.

      Hinweis

      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.

      Hinweis

      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 AdventureWorks2012.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);
    

    Hinweis

    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)