web-dev-qa-db-de.com

Bestimmen Sie die ROW, die den Fehler "BULK INSERT" verursacht hat.

ich mache eine Masseneinlage:

DECLARE @row_terminator CHAR;
SET @row_terminator = CHAR(10); -- or char(10)

DECLARE @stmt NVARCHAR(2000);
SET @stmt = '
  BULK INSERT accn_errors
   FROM ''F:\FullUnzipped\accn_errors_201205080105.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''[email protected]_terminator+'''
   )'
exec sp_executesql @stmt;

und erhalte folgende Fehlermeldung:

Msg 4832, Level 16, State 1, Line 2
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 2
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 2
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

gibt es eine Möglichkeit zu wissen, in welcher Reihe dieser Fehler aufgetreten ist?

ich bin in der Lage, 10.000.000 Zeilen ohne Probleme zu importieren und danach tritt ein Fehler auf

Um die problematische Zeile zu finden, verwenden Sie den Fehlerbezeichner.

BULK INSERT myData
FROM 'C:\...\...\myData.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
ERRORFILE = 'C:\...\...\myRubbishData.log' 
);

myRubbishData.log enthält die anstößigen Zeilen und eine Begleitdatei myRubbishData.log.txt gibt Ihnen Zeilennummern und Offsets in die Datei. 

Beispiel für Begleitdatei:

Row 3 File Offset 152 ErrorFile Offset 0 - HRESULT 0x80004005
Row 5 File Offset 268 ErrorFile Offset 60 - HRESULT 0x80004005
Row 7 File Offset 384 ErrorFile Offset 120 - HRESULT 0x80004005
Row 10 File Offset 600 ErrorFile Offset 180 - HRESULT 0x80004005
Row 12 File Offset 827 ErrorFile Offset 301 - HRESULT 0x80004005
Row 13 File Offset 942 ErrorFile Offset 416 - HRESULT 0x80004005
46
user1588622

Spaß Spaß Spaß. Ich habe keinen guten Weg gefunden, um diese Probleme zu beheben, also benutze ich rohe Gewalt. Das heißt, die Optionen FirstRow und LastRow sind sehr nützlich.

Beginnen Sie mit LastRow = 2 und versuchen Sie es weiter. Laden Sie die Ergebnisse in eine Wegwerftabelle, die Sie leicht abschneiden können.

Sie sollten auch bedenken, dass die erste Reihe auch Probleme verursachen kann.

5
Gordon Linoff

Ich habe eine CSV-Datei, die ich mit Bulk importiere

BULK INSERT [Dashboard].[dbo].[3G_Volume]
FROM 'C:\3G_Volume.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '","',
ROWTERMINATOR = '\n'
)
GO

Normalerweise habe ich dieses Skript verwendet und es hat keine Probleme, aber in seltenen Fällen.

Ich stoße auf diesen Fehler ..

"Der OLE DB-Provider" BULK "für den Verbindungsserver (null)" hat einen Fehler gemeldet. Der Provider hat keine Informationen zu dem Fehler angegeben. "

Dies geschieht normalerweise, wenn die letzte Zeile leere Werte enthält (null).

Sie müssen Ihre CSV-Datei in MS Access-Datenbank verknüpfen, um die Daten zu überprüfen ... (Wenn Ihre CSV-Datei nicht mehr als 1,4 Millionen Zeilen umfasst, können Sie sie in Excel öffnen.)

Da meine Daten etwa 3 Millionen Zeilen umfassen, muss Access DB verwendet werden.

Überprüfen Sie dann die Nummer der letzten Zeile mit Leerzeichen und subtrahieren Sie die Anzahl der Nullzeilen von Ihren Gesamtzeilen für csv.

wenn Sie am Ende 2 leere Zeilen haben und die Gesamtzahl der Zeilen 30000005 .__ ist. Das Skript wird wie folgt.

BULK
INSERT [Dashboard].[dbo].[3G_Volume]
 FROM 'C:\3G_Volume.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '","',
ROWTERMINATOR = '\n',
Lastrow = 30000003
)
GO

Prost ....__ Mhelboy

3
Mhelboy

Wenn CHAR (10) der Zeilenabschluss ist, glaube ich nicht, dass Sie ihn in Anführungszeichen setzen können, wie Sie es in BULK INSERT versuchen. Es gibt jedoch eine undokumentierte Möglichkeit, dies anzugeben:

ROWTERMINATOR = '0x0A'
3
Steve Kass

Ja - BULK INSERT hätte mit etwas mehr Details in den Fehlermeldungen getan, und der einzige Weg, dies zu umgehen, ist die Verwendung von Brute-Force-Methoden, wie Gordon zu Recht betont hat. Zunächst wird jedoch aufgrund des Fehlers, den Sie erhalten, entweder Ihr Zeilenabschlusszeichen nicht verstanden, oder am Ende der Datei fehlt ein Zeilenabschlusszeichen. Die Verwendung von FIRSTROW und LASTROW hilft dabei, dies zu ermitteln.

Sie müssen also Folgendes tun:

  1. Prüfen Sie, ob am Ende der Datei ein Zeilenabschlusszeichen steht. Wenn nicht, legen Sie einen ein und versuchen Sie es erneut. Stellen Sie außerdem sicher, dass die letzte Zeile alle erforderlichen Felder enthält. Es heißt 'EOF', dann ist das dein Problem.
  2. Sind Sie sicher, dass am Ende jeder Zeile ein LF steht? Versuchen Sie es mit einem CR (\ n, 0x0D) und prüfen Sie, ob dies funktioniert.
  3. Funktioniert immer noch nicht? Stellen Sie LASTROW = 2 ein und versuchen Sie es erneut. Dann versuche LASTROW = 3. Wenn Ihre Datei mehr als drei Zeilen enthält und dieser Schritt fehlschlägt, funktioniert der Zeilenabschluss nicht.
2
Peter

Ich bin auf die gleiche Ausgabe gestoßen. Ich hatte ein Shell-Skript geschrieben, um eine .csv in Linux zu erstellen. Ich nahm diese .csv zu Windows und versuchte, die Daten massenweise zu laden. Die Kommas "gefielen" nicht. Fragen Sie mich nicht nach dem Grund, aber ich habe ein * als Trennzeichen im Massenimport geändert und das Suchen und Ersetzen von Kommas mit * in meiner .csv .. -Datei durchgeführt Ich habe zu einem ~ als Trennzeichen gewechselt, das hat funktioniert ... Tab hat auch funktioniert - das Komma hat mir nicht gefallen ... Hoffe das hilft jemandem. 

1
user2125311

Nach meiner Erfahrung wird dies fast immer durch etwas in den letzten beiden Zeilen verursacht. tail die Importdatei und es sollte Ihnen immer noch der Fehler angezeigt werden. Öffnen Sie es dann in einem Volltexteditor, in dem Sie nicht druckbare Zeichen wie CR, LF und EOF sehen können. Das sollte es Ihnen ermöglichen, es in die Tat umzusetzen, auch wenn Sie nicht wissen, warum. Zum Beispiel, BULK INSERT schlägt fehl mit Zeilenabschlusszeichen in der letzten Zeile

0
feetwet

Ich habe das Problem umgangen, indem ich alle Felder in Strings konvertiert und dann einen gemeinsamen FIELDTERMINATOR verwendet habe. Das hat funktioniert:

BULK INSERT [dbo].[workingBulkInsert]  
FROM 'C:\Data\myfile.txt' WITH (
   ROWTERMINATOR = '\n', 
   FIELDTERMINATOR = ',' 
)

Meine Datendatei sieht jetzt so aus:

"01502","1470"
"01504","686"
"02167","882"
"106354","882"
"106355","784"
"106872","784"

Das zweite Feld war ein Dezimaltyp ohne doppelte Anführungszeichen (z. B. 1470.00). Durch die Formatierung beider Zeichenfolgen wurde der Fehler behoben.

0
Karl Hoaglund