2016-11-21 3 views
2

Я использую BULK INSERT для своих текстовых файлов. Все работает отлично, но одна вещь, которую я обнаружил. Если я дам окончательный стол финальной строки значение, оно будет импортировано. Если значение этого финального столбца в последней строке пуст, оно отбрасывает строку, несмотря на то, что столбец назначения допускает нулевые значения! Текстовый файл используется вкладка разделитель, вот пример из последних данных строки:BULK INSERT отсутствует последний ряд?

Mike Johnson 1/29/1987 M 

если я какое-либо значение в поле строки последней колонки будет вставлен, например, здесь:

Mike Johnson 1/29/1987 M test 

Это мой BULK Вставка:

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

Я пытался использовать \r вместо \n, но это не исправить эту проблему. Я также изучал некоторые веб-сайты, но не нашел решения. Мне интересно, что это может быть исправлено в SQL. Если кто-то знает, как это можно исправить, дайте мне знать.

РЕШЕНИЕ:

Для тех, кто, как использовать ColdFusion здесь линия, которая добавит новую строку в текстовом файле.

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

Ключ должен был включать двойные кавычки вокруг переменных coldfusion, иначе код не работает.

uncdir код здесь:

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

cffile.ServerFile вы можете получить из формы. Я использовал JQuery для отправки текстового файла. Надеюсь, это поможет. Спасибо.

+0

Вы пытались использовать '\ r \ n'? –

+0

Я пробовал, но это вызывает ошибку: coldfusion.tagext.sql.QueryTag $ DatabaseQueryException: ошибка Выполнение запроса базы данных. –

+0

Также я попытался использовать '0x0a' для параметра rowdeterminator. –

ответ

3

Я воспроизвел вашу проблему на SQL Server 2008 R2. Решение так же просто, как добавление новой строки в ваш файл, так что последняя строка заканчивается новой строкой.

Я создал два файла:

  1. without_newline
  2. with_newline

Затем побежал следующий сценарий:

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:

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

Результат 2:

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

Решение должно быть простым, как убедившись, что последняя строка заканчивается \r\n. Либо вы меняете процесс, который генерирует текстовый файл, либо выполняете его вручную, прежде чем выполнять объемную вставку.

Один из способов сделать это вручную - запустить EXEC xp_cmdshell 'echo. >> C:\temp\without_newline.txt' прямо перед тем, как сделать объемную вставку.

+0

Я, наконец, получил это, чтобы работать, добавив новую строку, и это решило проблему. Вот одна вещь, которая приходила мне в голову, когда я работал над этим кодом. Команда cmdshell добавляет новую строку в файл, как я смогу обнаружить корневую/папку файла, если это не на моем компьютере? Предположим, что другой пользователь хочет загрузить свой файл, и этот файл находится на своем компьютере. В этом случае каталог, который я использую, будет другим, и это вызовет проблему. –

+0

Привет @espresso_coffee. Я не совсем уверен, что буду следовать. В команде «data_file» в массивной команде вставки нет «обнаружения». В [документации] (https://msdn.microsoft.com/en-us/library/ms188365.aspx#Anchor_1) говорится: * «data_file должен указывать ** допустимый путь с сервера, на котором работает SQL Server. * * Если data_file является удаленным файлом, ** укажите имя универсальной именованной конвенции (UNC) **. "*. Возможно, хотя учетная запись SQL Server не имеет доступа к записи. В этом случае вы не можете многое сделать. Возможно, скопируйте файл, доступ к которому у учетной записи имеет доступ на запись? –

+0

@espresso_coffee Вероятно, лучше, хотя процесс, который генерирует файл данных, генерирует его с завершающей новой строкой. –