2016-11-21 15 views
2

Ich benutze BULK INSERT für meine Textdateien. Alles funktioniert gut, aber eine Sache, die ich entdeckt habe: Wenn ich der letzten Spalte der letzten Zeile einen Wert gebe, wird sie importiert. Wenn der Wert dieser letzten Spalte in der letzten Zeile leer ist, verwirft er die Zeile, obwohl die Zielspalte Nullwerte zulässt! Textdatei Tabula Begrenzer, hier ist beispielsweise der letzten Zeile Daten:BULK INSERT fehlende letzte Zeile?

Mike Johnson 1/29/1987 M 

wenn ich einen Wert in der letzten Zeile Spaltenfeld wird hier eingefügt, beispielsweise:

Mike Johnson 1/29/1987 M test 

Das ist mein MASSE Insert:

BULK INSERT ##TEMP_TEXT 
FROM '#uncdir#\#cffile.ServerFile#' 
WITH (
    FIELDTERMINATOR = '\t', 
    ROWTERMINATOR = '\n' 
) 

ich versuchte \r zu verwenden, anstatt \n aber das hat nicht das Problem zu beheben. Ich habe auch auf einigen Websites recherchiert, konnte aber keine Lösung finden. Ich frage mich, ob dies etwas ist, das in SQL behoben werden kann. Wenn jemand weiß, wie das behoben werden kann, lass es mich wissen.

LÖSUNG:

Für alle, wie Coldfusion verwenden hier ist die Linie, die Neue-Zeile in der Textdatei hinzufügen.

Der Schlüssel war, um Coldfusion Variablen in Anführungszeichen zu setzen, sonst funktioniert der Code nicht.

uncdir Code ist hier:

<cfset uncdir = createObject("java","java.net.InetAddress").getLocalHost().getHostName()/> 

cffile.ServerFile SieFormal aus dem Formular erhalten. Ich habe JQuery verwendet, um die Textdatei zu senden. Ich hoffe das hilft. Vielen Dank.

+0

Haben Sie versucht mit '\ r \ n'? –

+0

Ich habe versucht, aber das verursacht den Fehler: coldfusion.tagext.sql.QueryTag $ DatabaseQueryException: Fehler beim Ausführen der Datenbankabfrage. –

+0

Ich habe auch versucht, '0x0a' für den Rowdeterminator zu verwenden. –

Antwort

3

Ich reproduziert Ihr Problem auf SQL Server 2008 R2. Die Lösung besteht darin, der Datei einen Zeilenumbruch hinzuzufügen, sodass die letzte Zeile mit einem Zeilenumbruch endet.

ich zwei Dateien erstellt:

  1. without_newline
  2. with_newline

lief dann das folgende Skript:

CREATE TABLE #t(first_name VARCHAR(128),last_name_etc VARCHAR(128),sex CHAR(1),test VARCHAR(128)); 

BULK INSERT #t 
FROM 'C:\temp\without_newline.txt' 
WITH (
    FIELDTERMINATOR='\t', 
    ROWTERMINATOR='\n' 
); 

SELECT * FROM #t; 

TRUNCATE TABLE #t; 

BULK INSERT #t 
FROM 'C:\temp\with_newline.txt' 
WITH (
    FIELDTERMINATOR='\t', 
    ROWTERMINATOR='\n' 
); 

SELECT * FROM #t; 

DROP TABLE #t; 

1:

2:

first_name | last_name_etc  | sex | test 
-------------------------------------------- 
Tom   | Jackson 2/28/1986 | M | test 
Mike  | Johnson 1/29/1987 | M | NULL 

Die Lösung sollte so einfach sein wie dafür, dass die letzte Zeile mit \r\n beendet. Entweder Sie ändern den Prozess, der die Textdatei generiert, oder Sie tun es manuell, direkt bevor Sie die Masseneinfügung durchführen.

Eine Möglichkeit, dies manuell zu tun, wäre, EXEC xp_cmdshell 'echo. >> C:\temp\without_newline.txt' direkt vor der Masseneinfügung auszuführen.

+0

Ich habe es endlich zur Arbeit gebracht, neue Zeile hinzugefügt und das hat das Problem gelöst. Hier ist eine Sache, die mir in den Sinn kam, als ich an diesem Code arbeitete. Command cmdshell fügt der Datei eine neue Zeile hinzu, wie kann ich den Stamm/Ordner der Datei erkennen, wenn sie nicht auf meinem Computer ist? Angenommen, ein anderer Benutzer möchte seine Datei hochladen, und diese Datei befindet sich auf ihrem Computer. In diesem Fall wird das Verzeichnis, das ich verwende, anders sein, und das wird das Problem beheben. –

+0

Hallo @ espresso_coffee. Ich bin mir nicht ganz sicher, ob ich ihm folge. Es gibt keine "Erkennung" für die "Daten_Datei" in einem Masseneinfügebefehl. Die [Dokumentation] (https://msdn.microsoft.com/en-us/library/ms188365.aspx#Anchor_1) sagt: * "data_file muss ** einen gültigen Pfad vom Server angeben, auf dem SQL Server läuft. * * Wenn data_file eine Remote-Datei ist, ** geben Sie den Namen der Universal Naming Convention (UNC) ** an. "*. Es ist jedoch möglich, dass das SQL Server-Konto keinen Schreibzugriff hat. In diesem Fall können Sie nicht viel tun. Vielleicht die Datei kopieren, auf die der Account Schreibzugriff hat? –

+0

@espresso_coffee Es ist wahrscheinlich besser, wenn der Prozess, der die Datendatei generiert, ihn mit einem abschließenden Zeilenumbruch erzeugt. –