Frage

Wenn ich die folgende Abfrage im SQL Server 2000 Query Analyzer ausführe:

BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWS_PER_BATCH = 10000, TABLOCK)

Bei einer Textdatei, die 40 Zeilen lang dem Schema von OurTable entspricht, dann aber das Format für die letzten 20 Zeilen ändert (sagen wir, die letzten 20 Zeilen haben weniger Felder), erhalte ich eine Fehlermeldung.Die ersten 40 Zeilen werden jedoch in die Tabelle übernommen.Gibt es etwas an der Art und Weise, wie ich Bulk Insert aufrufe, das dazu führt, dass es nicht transaktional ist, oder muss ich etwas explizites tun, um ein Rollback bei einem Fehler zu erzwingen?

War es hilfreich?

Lösung

BULK INSERT fungiert als eine Reihe von Individuen INSERT Anweisungen und wenn der Job daher fehlschlägt, werden nicht alle festgeschriebenen Einfügungen zurückgesetzt.

Es kann jedoch innerhalb einer Transaktion platziert werden, sodass Sie etwa Folgendes tun könnten:

BEGIN TRANSACTION
BEGIN TRY
BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
   ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

Andere Tipps

Sie können die Einfügungen rückgängig machen.Dazu müssen wir zunächst zwei Dinge verstehen

BatchSize

:Anzahl der pro Transaktion einzufügenden Zeilen.Die Standardeinstellung ist die gesamte Datendatei.Eine Datendatei befindet sich also in einer Transaktion

Angenommen, Sie haben eine Textdatei mit 10 Zeilen, wobei Zeile 8 und Zeile 7 einige ungültige Details enthalten.Wenn Sie die Datei massenhaft einfügen, ohne oder mit Angabe der Stapelgröße, werden 8 von 10 in die Tabelle eingefügt.Die ungültigen Zeilen, d. h.8. und 7. scheitern und werden nicht eingefügt.

Dies geschieht aufgrund der Standardeinstellung MAXERRORS Die Anzahl beträgt 10 pro Transaktion.

Gemäß MSDN:

MAXIMALE FEHLER:

Gibt die maximale Anzahl von Syntaxfehlern an, die in den Daten zulässig sind, bevor der Bulk-Import-Betrieb storniert wird.Jede Zeile, die nicht von der Bulk-Import-Operation importiert werden kann, wird ignoriert und als ein Fehler gezählt.Wenn max_errors nicht angegeben ist, ist der Standardwert 10.

Damit alle 10 Zeilen fehlschlagen, auch wenn eine davon ungültig ist, müssen wir festlegen MAXERRORS=1 Und BatchSize=1 Hier spielt auch die Anzahl der BatchSize eine Rolle.

Wenn Sie BatchSize angeben und sich die ungültige Zeile innerhalb des bestimmten Stapels befindet, wird nur der bestimmte Stapel zurückgesetzt, nicht der gesamte Datensatz.Seien Sie also vorsichtig, wenn Sie diese Option wählen

Ich hoffe, das löst das Problem.

Wie in der angegeben BATCHSIZE Definition für BULK INSERT in der MSDN-Bibliothek (http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx) :

„Wenn dies fehlschlägt, schreibt SQL Server die Transaktion für jeden Stapel fest oder setzt sie zurück …“

Zusammenfassend lässt sich sagen, dass es nicht notwendig ist, der Masseneinfügung Transaktionalität hinzuzufügen.

Versuchen Sie, es in eine benutzerdefinierte Transaktion einzufügen und sehen Sie, was passiert.Eigentlich sollte es so zurückgehen, wie Sie es beschrieben haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top