Массовая вставка SQL - несоответствие - PullRequest
2 голосов
/ 18 мая 2011

Хорошо, я получаю следующую ошибку, которая кажется странной.

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

Мой CSV-файл отформатирован в следующем формате

1, Аарон, Aaberg, 19700926, MALE

Но если я сделаю следующее:

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender)
VALUES ('1' 'Test', 'Me', 19851118, 'Male')

Работает нормально? Что дает? Я попробовал все под солнцем. Если я использую INT в качестве типа данных для дня рождения, импорт работает нормально. Я попытался затем CAST и / или конвертировать int, и я, очевидно, получил арифметическое переполнение.

Я забыл дать вам стол Код:

CREATE TABLE Test.BulkInsert (ID int NOT NULL,
                  FirstName VARCHAR(40),
                  LastName VARCHAR(40),
                  BirthDay SMALLDATETIME,
                          Gender VARCHAR(6)

)
GO

Ответы [ 5 ]

0 голосов
/ 19 мая 2011

Похоже, ваша дата рождения не соответствует требованиям smalldatetime (?)

Сначала импортируйте его как int (поскольку вы знаете, что это работает).

тогда некоторые вещи вы можете запросить об этом
1) длина, где длина <8 <br /> 2) дата рождения <19000101 <br /> 3) дата рождения> 20790601
(1 января 1900 г. - до 6 июня 2079 г. - предел диапазона)
4) убедитесь, что каждый символ имеет номер 0-9

, а затем ...

надеюсь, вам не придется проходить через это каждый раз. Но, если вы это сделаете, подумайте над тем, чтобы добавить в процесс создания .csv какую-то проверку.

0 голосов
/ 19 мая 2011

Я бы посмотрел ваши данные, чтобы увидеть, что вы передаете в строке 129 для даты. Я полагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что дата выходит за пределы диапазона для значения SMALLDATETIME (диапазон - с 1 января 1900 года по 6 июня 2079 года). Может быть, год поменял пару цифр (например, 9185 вместо 1985 года) или что-то в этом роде. Тогда будет понятно, почему вы получаете сообщение «Преобразование типа данных varchar в тип данных smalldatetime привело к значению вне допустимого диапазона», когда вы сначала преобразовываете дату в varchar.

0 голосов
/ 18 мая 2011

Одна возможность (или, возможно, опечатка в вашем посте): ваша таблица имеет четыре столбца; ваша строка CSV имеет пять значений.

Другое - ваш оператор SQL имеет целочисленное значение. Вставка CSV может рассматривать его как строку; по сути, этот SQL:

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender)
VALUES ('1' 'Test', 'Me', '19851118', 'Male')
0 голосов
/ 18 мая 2011

CSv-файлы почти так же плохи, как XLS и XLST-файлы для хранения неверных данных.Я предлагаю открыть его и посмотреть на данные в ссылочной строке и рядом с ними.

0 голосов
/ 18 мая 2011

Вы проверили свои региональные настройки?Я полагаю, что BCP будет использовать это при попытке импортировать столбец datetime.

В качестве альтернативы (и, как кажется большинству людей), вы можете импортировать в промежуточную таблицу как VARCHAR, а затем выполнить INSERT в вашу реальную таблицу с оператором CONVERT над столбцом datetime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...