Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 BULK INSERT и кавычки  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Делаю импорт данных из текстового файла (csv).
BULK INSERT #client_load
FROM '\\server\test.csv'
   WITH 
      (
         FIELDTERMINATOR =';',
         ROWTERMINATOR ='\r\n',
	     FIRSTROW=2,
		 KEEPNULLS,
		 FORMATFILE = '\\server\test.frm',
		 ERRORFILE = '\\server\test.err',
		 MAXERRORS = 100000
      );


Этот код работает с таким файлом:
id;f_name;m_name;l_name;region
7337;АГИЛЬ;МАЗАХИР ОГЛЫ;БАРИГОВ;69

Но, если поля в файле будут в кавычках, происходит ошибка:
"id";"f_name";"m_name";"l_name;region"
"7337";"АГИЛЬ";"МАЗАХИР ОГЛЫ";"БАРИГОВ";"69"

/*
Сообщение 4864, уровень 16, состояние 1, строка 4
Ошибка преобразования массовой загрузки данных (несоответствие типов или недопустимый символ для указанной кодовой страницы) в строке 2, столбце 1 (ID_Client).
*/


В документации сказано:
https://technet.microsoft.com/ru-ru/library/ms188609.aspx
Файлы с разделителями-запятыми (CSV) не поддерживаются в операциях массового импорта SQL Server. Однако в некоторых случаях CSV-файл можно использовать в качестве файла данных для массового импорта данных в SQL Server. Обратите внимание, что признаком конца поля CSV-файла не обязательно должна быть запятая. CSV-файл, который можно использовать в качестве файла данных для массового импорта, должен соответствовать следующим условиям.

Поля данных не должны содержать признак конца поля.
Или никакие, или все значения в полях данных должны заключаться в кавычки ("").


Что не так?
25 мар 15, 17:22    [17431532]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
Тройка
Member

Откуда:
Сообщений: 88
virtuOS
"id";"f_name";"m_name";"l_name;region"

Быть может дело в том, что нужно поля l_name и region таки разделить кавычками?
25 мар 15, 17:39    [17431624]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Ошибся при набивании файла в браузере. Кавычки в файле есть.
"id";"f_name";"m_name";"l_name";"region"
"7337";"АГИЛЬ";"МАЗАХИР ОГЛЫ";"БАРИГОВ";"69"
25 мар 15, 17:43    [17431649]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
Что не так?

"несоответствие типов или недопустимый символ для указанной кодовой страницы"
ID_Client наверное числового типа
25 мар 15, 18:03    [17431749]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Конечно, id_client типа int. Я ожидал, что кавычки будут убраны у всех полей и результат будет аналогичен первому случаю. Если нет, то как обрабатывать данные, например такую строку "ЗАО ""Рога и копыта """?
25 мар 15, 20:30    [17432238]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Почему будут убраны? Вы передаете неверный CSV. Заголовки не должны быть с кавычках. Загрузчик пытается преобразовать id в число, далее исключение.
25 мар 15, 21:04    [17432335]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Почему же csv неправильный? Такой файл получается, например, при экспорте из sql через коммандлет PowerShell SqlServerCmdletSnapin100.
В данном случае мне не понятен смысл фразы "Или никакие, или все значения в полях данных должны заключаться в кавычки ("").". Если кавычки не обрабатываются, то об этом и следовало (по моей логике) указать в хелпе, а не писать "или все, или никакие".

автор
Загрузчик пытается преобразовать id в число, далее исключение.

Загрузчик пытается преобразовать в число не "id", а "7337". Вот текст ошибок из создаваемых файлов:
--Из test.err.Error.Txt
--Row 2 File Offset 120 ErrorFile Offset 0 - HRESULT 0x80020005

--Из test.err
--"7337";"АГИЛЬ";"МАЗАХИР ОГЛЫ";"БАРИГОВ";"69"
26 мар 15, 09:05    [17433356]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
Если кавычки не обрабатываются, то об этом и следовало (по моей логике) указать в хелпе, а не писать "или все, или никакие".

Что мешает вместо раздумий просто взять и импортировать какой-нибудь файл в таблицу, где все поля будут символьными ?
26 мар 15, 09:12    [17433375]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Вчера не мог сообразить, как корректно обработать множественные кавычки. С утра видимо мозги лучше работают.

declare @t varchar(50) = '"ЗАО ""Рога и копыта"""'

select case when substring(@t,1,1) = '"' and substring(@t,len(@t),1) = '"' 
				then replace(substring(@t,2,len(@t)-2), '""', '"') end
26 мар 15, 09:27    [17433415]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
yesMan
Member

Откуда:
Сообщений: 15
Вопрос немного в тему, как быть если в поле встречается разделитель в csv в этом случае строка оборачивается в кавычки ""
но sql такое кушать не умеет ну или ссылкой или выдержкой поправьте
id;f_name;m_name;l_name;region
7337;АГИЛЬ;"МАЗАХИР;ОГЛЫ";БАРИГОВ;69
733;ИЛЬ;МАЗАХИР;БАРИГОВ;69


пример не в тему но смысл понятен.
26 мар 15, 17:41    [17436555]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT и кавычки  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Так, появился вопрос по программе bcp.
Из командной строки выполняю загрузку файла:
bcp dbo.client_load in $FileNameCSV -S $SQLServer -d $SQLDBName -U $SQLUserName -P $SQLPassword -f $FORMATFILE -t ";" -r "\n"


Вывод:
автор
Начато копирование...
SQLState = 22005, NativeError = 0
Error = [Microsoft][SQL Server Native Client 10.0]Недопустимое символьное значение для указания отклонения

Скопировано строк: 100.
Размер сетевого пакета (в байтах): 4096
Время (мс) Всего : 78 В среднем : (1282.05 строк в секунду.)

В файле 100 строк, все они успешно загружаются в таблицу.
В %errorlevel% значение 0.
Погуглил, нашел только это, статус Closed as Won't Fix.
Версия bcp 10.50.2500.0

Можно ли подавить ошибку или оставить всё как есть?
27 мар 15, 11:17    [17439128]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить