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

Откуда:
Сообщений: 6
Ошибки при загрузки через bcp

Использую bcp для загрузки из текстового файла в таблицу.
Строка которую выполняю в cmd:
bcp my_data.dbo.ACCOUNTS in "D:\Test\ACCOUNTS.txt" -S "ms2005" -U "sa" -P "sa" -e "D:\Test\ERR_ACCOUNTS.err" -f "D:\Test\FMT_ACCOUNTS.fmt" -R

При выполнении получаю ошибку:
Error = [Microsoft][SQL Native Client]Invalid date format
Смотрю таблицу даты воспринимаются в виде мм.дд.гггг.. Как написано параметр -R использует региональные настройки, но что с ним что без него одна и та же ошибка(перепробовал множество рег. настроек).
Установил на другой компьютер Microsoft SQL 2008R2 RU и загрузка проходит нормально(даты воспринимаются, как надо).
Может кто знает, как можно настроит без установки другой версии Microsoft SQL??

Второй вопрос:
При загрузки данных в таблицу в уникальным ключом, элемент не прошел проверку на уникальность, то выдается ошибка и загрузка останавливается:

SQLState = 23000, NativeError = 2601
Error = [Microsoft][SQL Native Client][SQL Server]Cannot insert duplicate key row in object 'dbo.ACCOUNTS' with unique index 'UX_ACCOUNTS'.
SQLState = 01000, NativeError = 3621
Warning = [Microsoft][SQL Native Client][SQL Server]The statement has been terminated.

Можно ли как то отключить остановку выполнения загрузки??
8 сен 11, 08:19    [11244949]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alexandex_D,

используйте языковонезависимый формат даты - 112, 120 или 126.
8 сен 11, 09:22    [11245071]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
Alexandex_D
Ошибки при загрузки через bcp

Использую bcp для загрузки из текстового файла в таблицу.
Строка которую выполняю в cmd:
bcp my_data.dbo.ACCOUNTS in "D:\Test\ACCOUNTS.txt" -S "ms2005" -U "sa" -P "sa" -e "D:\Test\ERR_ACCOUNTS.err" -f "D:\Test\FMT_ACCOUNTS.fmt" -R

При выполнении получаю ошибку:
Error = [Microsoft][SQL Native Client]Invalid date format
Смотрю таблицу даты воспринимаются в виде мм.дд.гггг.. Как написано параметр -R использует региональные настройки, но что с ним что без него одна и та же ошибка(перепробовал множество рег. настроек).
Установил на другой компьютер Microsoft SQL 2008R2 RU и загрузка проходит нормально(даты воспринимаются, как надо).
Может кто знает, как можно настроит без установки другой версии Microsoft SQL??

Я бы поля в целевой таблице сделал бы поля varchar, а танцы с бубном вокруг проблемных данных устраивал уже на стороне SQLServer. Там куча инструментов для этого.

Например, у нас частый случай когда не все строки в файле могут быть Datetime а надо именно он. Грузим как Varchar, при помощи isdate() выпиливаем кривые значения, а потом делаем alter column. В результате всё получается красиво.

если нет возможности менять целевую таблицу (например её пользует сайт) то описанные действия можно производить во временной таблице а потом инсертом переливать красивые данные.

Alexandex_D
Второй вопрос:
При загрузки данных в таблицу в уникальным ключом, элемент не прошел проверку на уникальность, то выдается ошибка и загрузка останавливается:

SQLState = 23000, NativeError = 2601
Error = [Microsoft][SQL Native Client][SQL Server]Cannot insert duplicate key row in object 'dbo.ACCOUNTS' with unique index 'UX_ACCOUNTS'.
SQLState = 01000, NativeError = 3621
Warning = [Microsoft][SQL Native Client][SQL Server]The statement has been terminated.

Можно ли как то отключить остановку выполнения загрузки??


Нет, это же конфликт с уникальным ключом. Можно кильнуть ключ, залить данные, выпилить дубликаты по ключу, пересоздать его.
8 сен 11, 09:31    [11245120]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Alexandex_D
Member

Откуда:
Сообщений: 6
iljy,

Где указывать формат даты?? Про задание формата даты нашел только один ключ это -R, но по тестам не заметил, что они используются.
8 сен 11, 14:56    [11247957]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alexandex_D
iljy,

Где указывать формат даты?? Про задание формата даты нашел только один ключ это -R, но по тестам не заметил, что они используются.

Формат даты надо использовать правильный при формировании файла. Иначе только загружать во временную таблицу с текстовым полем и потом ее на сервере потрошить. Учитывая ваши проблемы с уникальными ключами, вам по любому придется так делать.
8 сен 11, 16:19    [11249000]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Alexandex_D
Member

Откуда:
Сообщений: 6
iljy,

Формат даты в файлах нормальный (пр. 15/12/2010), но на одном компьютере 2008R2 RU даты воспринимаются нормально в виде(дд.мм.гггг), а где англ. версия то там воспринимает в виде(мм.дд.гггг). Может можно, где то в настройках клиентской части задать?
9 сен 11, 07:35    [11251342]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alexandex_D
iljy,

Формат даты в файлах нормальный (пр. 15/12/2010),

Языковозависимый формат по определению не является нормальным для передачи данных между системами.
9 сен 11, 08:26    [11251412]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Alexandex_D
Формат даты в файлах нормальный (пр. 15/12/2010)

используйте формат YYYYMMDD - его все понимают
9 сен 11, 08:30    [11251422]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
guest45
Guest
лучший совет от Mgvlad - грузите всё в nvarchar, а там уже разбирайтесь, что к чему.
иначе всё равно придётся как-то программно разбираться с кривизной данных в файлах для загрузки.

А вообще-то sql работает под учёткой, кусты реестра учёток лежат в HKEY_USERS.
Можно поменять там формат даты. Но это скажется на всех программах, которые работают из-под этой учётки.
9 сен 11, 08:50    [11251498]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
AlekseyVP
Guest
Alexandex_D,

Банальная задача импорта данных всегда сводится к 3м пунктам:
1. Загрузить данные как есть в таблицу с текстовыми полями.
2. Обработать данные по вкусу (см. ТЗ) на стороне сервера.
3. Привести данные в конечный вид для дальнейшего потребления другими системами.
9 сен 11, 13:27    [11253556]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Alexandex_D
Member

Откуда:
Сообщений: 6
Написал процедуру для загрузку через openrowset нужную таблицу записывает правильные данные, а в таблицу с текстовыми полями кривые данные. Грузит нормально(даты хорошо парсит и по уникальности не останавливает загрузку).
Но для загрузки очень важна скорость, т.к. необходимо грузить большие объемы данных.
Через bcp быстрее получается, с уникальностью все понятно, что нельзя не как отключить остановку, а вот с датами как то можно обойти, т.к. при установки клиента Microsoft SQL 2008R2 RU даты парсятся, как дд.мм.гггг => где то можно сменить, какие то настройки (установка на все машины это клиента может быть не возможна).
13 сен 11, 08:00    [11266942]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31957
Alexandex_D
Через bcp быстрее получается, с уникальностью все понятно, что нельзя не как отключить остановку, а вот с датами как то можно обойти, т.к. при установки клиента Microsoft SQL 2008R2 RU даты парсятся, как дд.мм.гггг => где то можно сменить, какие то настройки (установка на все машины это клиента может быть не возможна).
Вам уже 4 человека сказали, что делать, прочитайте уже :-)

Я тоже присоединяюсь - грузите с помощью bcp всё в nvarchar, а там уже разбирайтесь, что к чему. Самый быстрый, универсальный и простой способ.
13 сен 11, 08:46    [11267015]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Alexandex_D
Member

Откуда:
Сообщений: 6
alexeyvg,

я как бы читать умею, это для меня не вариант надо грузить очень большие объемы данных(сотни Гб) и быстро. Написал уже 3и разные загрузки через bcp получается самое быстрое(быстрее чем через openrowset).
Через openrowset и то быстрее получиться, чем кидать сначала во временную таблицу, а потом парсить.
Я спрашиваю за тем, что может кто знает, как по другому решить эти проблемы.
13 сен 11, 17:55    [11271405]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Alexandex_D,

А если SSIS попробовать испрользовать?
13 сен 11, 18:29    [11271548]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Alexandex_D
Member

Откуда:
Сообщений: 6
Fire83,

Загрузку данных буду производить не я, а пользователи. Поэтому, я описываю программый код для всех загрузок и запуска их из рабочего места пользователя. Про SSIS особо не читал, т.к. это графическое средство.
13 сен 11, 18:54    [11271634]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Alexandex_D,

При чем здесь "графическое средство"? На выходе у вас будет пакет, который может быть выполнен откуда угодно.
13 сен 11, 19:00    [11271651]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
Alexandex_D
я как бы читать умею, это для меня не вариант надо грузить очень большие объемы данных(сотни Гб) и быстро. Написал уже 3и разные загрузки через bcp получается самое быстрое(быстрее чем через openrowset).
Через openrowset и то быстрее получиться, чем кидать сначала во временную таблицу, а потом парсить.
Я спрашиваю за тем, что может кто знает, как по другому решить эти проблемы.


Присоединяюсь к совету использовать промежуточную таблицу. Я в похожем случае сделал базу Staging и создал там таблицы с соответсующими постоянным таблицам именами полей но тип всех полей промежуточных таблиц - varchar. При помощи BCP заливал данные в базу Staging, а потом переливал в постоянные таблицы, проводя необходимые мне преобразования непосредственно при вставке данных из промежуточных таблиц. Там же никаких условий, один INSERT, единственное что надо преобразовывать строку в дату/число в случае если поле в постоянной таблице типа дата/время или число.
13 сен 11, 19:19    [11271777]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31957
Alexandex_D
alexeyvg,

я как бы читать умею, это для меня не вариант надо грузить очень большие объемы данных(сотни Гб) и быстро. Написал уже 3и разные загрузки через bcp получается самое быстрое(быстрее чем через openrowset).
Через openrowset и то быстрее получиться, чем кидать сначала во временную таблицу, а потом парсить.
Я спрашиваю за тем, что может кто знает, как по другому решить эти проблемы.
Странно, через bcp + парс должно быть быстрее, чем через openrowset.

Парс там же символический, просто вставка с правильным конвертом. Хотя конечно вставка медленная в этом случае...

По скорости кардинальное решение проблемы - парс и преобразование текстовых файлов отдельной программой.

Ну и остаётся проблема вставки дубликатов, её уж никак без промежуточной обработки не решить.
13 сен 11, 19:45    [11271899]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки при загрузки через bcp  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
alexeyvg
Alexandex_D
alexeyvg,

я как бы читать умею, это для меня не вариант надо грузить очень большие объемы данных(сотни Гб) и быстро. Написал уже 3и разные загрузки через bcp получается самое быстрое(быстрее чем через openrowset).
Через openrowset и то быстрее получиться, чем кидать сначала во временную таблицу, а потом парсить.
Я спрашиваю за тем, что может кто знает, как по другому решить эти проблемы.
Странно, через bcp + парс должно быть быстрее, чем через openrowset.

Парс там же символический, просто вставка с правильным конвертом. Хотя конечно вставка медленная в этом случае...

По скорости кардинальное решение проблемы - парс и преобразование текстовых файлов отдельной программой.

Ну и остаётся проблема вставки дубликатов, её уж никак без промежуточной обработки не решить.


Дубликаты можно вставить и в основную таблицу, но придётся удалить уникальный индекс, а после выпиливания пересоздать. Но этот вариант возможен только если таблица активно не юзается + займёт много времени.
14 сен 11, 12:09    [11274462]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить