Импортировать проблему с CSV-файлом в таблицу SQL Server 2008

Я использую мастер импорта и экспорта SQL Server для импорта данных из файла csv для добавления в мою уже существующую таблицу SQL Server.

Итак, чтобы добавить данные из файла csv в мою таблицу SQL Server, в окне Choose a Data Source я удостоверяюсь, что каждый столбец в моем источнике данных csv имеет тип данных, эквивалентный типу данных столбцов моей таблицы SQL Server.

Тем не менее, я всегда получаю ошибку при импорте.

Ошибка 0xc02020a1: поток данных, задача 1: преобразование данных не удалось. Преобразование данных для столбца «Срок погашения (часы)» вернуло значение состояния 2 и текст состояния «Не удалось преобразовать значение из-за возможной потери данных». (Мастер импорта и экспорта SQL Server)

Ошибка 0xc0209029: задача потока данных 1: код ошибки SSIS DTS_E_INDUCEDTRANSFORMFAILUREONERROR. «Выходной столбец «Срок погашения (часы)» (42)» завершился неудачно, так как произошел код ошибки 0xC0209084, а расположение строки ошибки в «выходном столбце «Срок погашения (часы)» (42)» указывает на сбой при ошибке. Произошла ошибка в указанном объекте указанного компонента. Перед этим могут быть опубликованы сообщения об ошибках с дополнительной информацией о сбое. (Мастер импорта и экспорта SQL Server)

Моя таблица SQL Server имеет Maturity (часы) как тип данных int.

Для моего CSV-файла в мастере экспорта/импорта SQL Server я выбираю DT_I4 для Maturity (часов), что эквивалентно типу данных int в SQL Server. Тем не менее, я не мог избавиться от этой ошибки в течение последних 3 часов.

Любая подсказка о том, как решить эту проблему?


person Nemo    schedule 14.03.2013    source источник
comment
все поля имеют одинаковую длину, кроме типа данных?   -  person Ron    schedule 15.03.2013
comment
Привет Рон, Спасибо за ваш комментарий. Помимо обеспечения размера поля для каждого строкового поля в конце SQL и CSV-файле, как мне обеспечить размер поля для столбцов int?   -  person Nemo    schedule 15.03.2013
comment
Я не уверен насчет значений в вашем CSV-файле и должен ли столбец быть строго int. Я бы попытался изменить тип столбца на числовой и указать точность.   -  person Ron    schedule 15.03.2013
comment
Моя таблица SQL имеет тип данных int для поля Maturity (Hours). Согласно вашему предложению, в мастере импорта я изменил тип данных в исходном csv на DT_Numeric и установил DataPrecision. Однако я получаю ту же ошибку. :(   -  person Nemo    schedule 15.03.2013
comment
Можете ли вы иметь числовой тип данных в SQL?   -  person Ron    schedule 15.03.2013
comment
Таблица, которую я имею в SQL, также импортируется из таблицы базы данных MS Access, а таблица MS Access имеет тип данных int для поля Maturity (Hours). Когда я впервые импортировал таблицу Access на сервер SQl, тип данных, поддерживаемый в SQL, отображал такие типы данных SQL, как int, smallint, bigint. Поскольку это преобразование из int в int, я также выбрал int для поля SQL Maturity (Hours). Поддерживает ли SQL числовой тип данных?   -  person Nemo    schedule 15.03.2013
comment
SQL Server 2008 имеет числовой тип данных — msdn. microsoft.com/en-us/library/ms187746(v=sql.100).aspx   -  person Ron    schedule 15.03.2013
comment
Подход Рона должен был сработать. Немо, у меня была недавняя проблема с точно таким же типом поля и источником CSV. Оказывается, некоторые из значений в поле, которые, как мне казалось, содержали только целые числа, на самом деле содержали символы. Откройте файл CSV в Excel и посмотрите, есть ли у вас такая же проблема.   -  person    schedule 15.03.2013
comment
Я проверил свой файл CSV в Excel и вижу, что в поле «Зрелость (часы)» есть данные в диапазоне от 0 до 11465, а на вкладке «Главная» Excel для этого поля указан его общий тип. Я попробовал предложение Рона - попытался использовать десятичный тип данных для таблицы SQl, поскольку числовое значение эквивалентно десятичному. Поэтому я установил десятичное число (5,0) для таблицы SQL и при импорте csv установил тип поля как DT_NUMERIC с DataPrecision 5. Все та же ошибка.   -  person Nemo    schedule 15.03.2013
comment
Я предлагаю вам разделить и победить ваш файл CSV и найти строку данных с ошибкой. Вы, вероятно, найдете некоторые неверные данные с числом, которое слишком велико, чтобы поместиться в INT4.   -  person Nick.McDermaid    schedule 15.03.2013
comment
1. Просто для проверки позвольте службам SSIS создать таблицу. Это можно сделать, нажав кнопку «Создать» рядом с полем «Таблица» в назначении OleDB. Сравните структуру этой таблицы со своей.   -  person Anoop Verma    schedule 15.03.2013
comment
2. Перенаправьте строки ошибок в текстовый файл вместо разделения исходного файла.   -  person Anoop Verma    schedule 15.03.2013
comment
Спасибо Anoop за ваш i/p. Я потрачу больше времени на тестирование, как вы предложили, и дам вам знать, как оно идет.   -  person Nemo    schedule 15.03.2013


Ответы (1)


Просто посмотрите в файле csv, есть ли в каком-либо поле какие-либо запятые (в случае, если вы использовали запятую в качестве разделителя столбцов или двойные кавычки (в случае, если вы использовали двойные кавычки в качестве текстового квалификатора). Ваша проблема должна подпадать под указанные выше 2 сценария.

Примечание. Я поставил это как ответ, так как не мог комментировать ваш вопрос.

person Maximus    schedule 25.03.2013
comment
Я использовал двойные кавычки в качестве квалификатора текста и, отслеживая огромное количество данных методом «разделяй и властвуй», обнаружил, что в нескольких строках есть двойные кавычки. Спасибо за общий ответ. - person Nemo; 28.03.2013
comment
Подскажите, пожалуйста, как вы справились с этой ошибкой? вы просто пропустили эти записи или сделали какое-то другое исправление? - person Maximus; 29.03.2013
comment
Раньше я получал CSV-файлы от одной из своих команд, и у меня была задача импортировать их в мою таблицу sql. Я попросил свою команду прислать мне чистые данные. Я хочу, чтобы команда была ответственна за предоставление мне правильного источника. :) - person Nemo; 29.03.2013