2016-12-02 3 views
0

Я пытаюсь использовать BULK INSERT для добавления строк в существующую таблицу из CSV-файла. Теперь у меня есть небольшой файл для тестирования со следующим форматированием:BULK INSERT не правильно вставлен из CSV

UserID,Username,Firstname,Middlename,Lastname,City,Email,JobTitle,Company,Manager,StartDate,EndDate 
273,abc,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd 
274,dfg,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd 
275,hij,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd 

И это то, что мой запрос в настоящее время выглядит следующим образом:

BULK INSERT DB_NAME.dbo.Users 
    FROM 'C:\data.csv' 
    WITH 
    (
     FIRSTROW = 2, 
     FIELDTERMINATOR = ',', 
     ROWTERMINATOR = '\n' 
    ) 

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

Что может быть причиной этого? То, что я пытаюсь выполнить, это вставить эти строки в отдельные строки в таблице. См (длинное) Изображение ниже enter image description here

Первый столбец на самом деле столбец IDENTITY так в файл я просто определил целое, даже если она будет перезаписана автогенерируемая ID, как я не знаю, как сказать запрос для начала вставки из второго поля.

В фактической таблице создано больше столбцов, чем указано в файле, поскольку не все должно быть заполнено. Может ли это быть причиной?

+1

Проверьте свой любимый текстовый редактор, чтобы узнать, что собой представляют все символы. Например, в Notepad ++ включить «Показать все символы». Возможно, ваши строки заканчиваются на '\ r' вместо' \ r \ n'. –

+1

Для тестирования вы можете создать временную таблицу без поля идентификации и вынуть инструкцию WITH, чтобы узнать, какие данные вы получите? –

+0

В зависимости от кодировки символов новые символы строки помечены по-разному. Вы пытались использовать '/ r/n'? – Fka

ответ

2

Проблема в том, что вы загружаете данные в первый столбец. Чтобы пропустить столбец, создайте представление по вашей таблице только с колонками, которые вы хотите загрузить, и BULK INSERT. Ниже пример (из MSDN: https://msdn.microsoft.com/en-us/library/ms179250.aspx):

CREATE VIEW v_myTestSkipCol AS 
    SELECT Col1,Col3 
    FROM myTestSkipCol; 
GO 

USE AdventureWorks2012; 
GO 
BULK INSERT v_myTestSkipCol 
FROM 'C:\myTestSkipCol2.dat' 
WITH (FORMATFILE='C:\myTestSkipCol2.xml'); 
GO 

То, что я бы порекомендовал вам сделать вместо этого создать промежуточную таблицу, которая соответствует файл точно. Загрузите данные в это, а затем используйте инструкцию INSERT, чтобы скопировать ее в свою постоянную таблицу. Этот подход гораздо более прочный и гибкий. Например, после загрузки промежуточной таблицы вы можете выполнить некоторую проверку или очистку данных перед загрузкой постоянной таблицы.

+1

Пожалуйста, не ставьте одинаковые ответы на несколько вопросов. (Https://meta.stackexchange.com/q/104227). Отправьте один хороший ответ, затем проголосовате/отметьте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не является дубликатом, * приложите свои ответы на вопрос *. Я удалил [другую копию] (https://stackoverflow.com/questions/40757662/simple-sql-bulk-insert-not-working/40758128#40758128), так как этот был хорошо принят. –