BULK INSERT fehlt letzte Zeile?

Ich verwende BULK INSERT für meine Textdateien. Alles funktioniert gut, aber eine Sache, die ich entdeckte, Wenn ich die letzte Zeile die letzte Spalte einen Wert geben, wird es importieren. Wenn der Wert dieser letzten Spalte in der letzten Zeile leer ist, verwirft sie die Zeile, trotz der Tatsache, dass die Zielspalte Null enthält! Textdatei verwendet Tabulator-Trennzeichen, hier ist Beispiel für die letzten Zeilendaten:

Mike Johnson 1/29/1987 M 

Wenn ich einen Wert in der letzten Spalte Feld Zeile eingefügt wird, Beispiel hier:

 Mike Johnson 1/29/1987 M test 

Das ist mein BULK Insert:

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

Ich habe versucht, \r anstelle von \n aber das hat nicht das Problem beheben. Ich habe auch auf einigen Webseiten recherchiert, konnte aber keine Lösung finden. Ich frage mich, das ist etwas, das in SQL behoben werden kann. Wenn jemand weiß, wie dies behoben werden kann, lass es mich wissen.

LÖSUNG:

Für jedermann wie ColdFusion hier ist die Zeile, die Newline in der Textdatei hinzufügen wird.

 exec xp_cmdshell 'echo. >> "#uncdir#\#cffile.serverFile#"'; 

Key war, doppelte Anführungszeichen auf coldfusion variables zu setzen, sonst Code funktioniert nicht.

uncdir code ist hier:

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

cffile.serverFile können Sie aus dem Formular erhalten. Ich habe JQuery benutzt, um die Textdatei einzureichen. Ich hoffe das hilft. Vielen Dank.

Ich habe Ihr Problem auf SQL server 2008 R2 reproduziert. Die Lösung ist so einfach wie das Hinzufügen eines Newline zu Ihrer file, so dass die letzte Zeile mit einem Zeilenumbruch endet.

Ich habe zwei fileen erstellt:

  1. ohne_newline
  2. mit_newline

Dann lief 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; 

Ergebnis 1:

 first_name | last_name_etc | sex | test -------------------------------------------- Tom | Jackson 2/28/1986 | M | test 

Ergebnis 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, dass die letzte Zeile mit \r\n endet. Entweder man ändert den process, der die Textdatei erzeugt oder manuell richtig macht, bevor du den Bulk-deployment machst.

Eine Möglichkeit, dies manuell zu tun, wäre, EXEC xp_cmdshell 'echo. >> C:\temp\without_newline.txt' zu laufen EXEC xp_cmdshell 'echo. >> C:\temp\without_newline.txt' EXEC xp_cmdshell 'echo. >> C:\temp\without_newline.txt' bevor du den Bulk-deployment machst.