Ошибка преобразования типов данных при импорте из Excel в SQL Server 2008
Каждый раз, когда я пытаюсь импортировать файл Excel в SQL Server, я получаю конкретную ошибку. Когда я пытаюсь редактировать сопоставления, значением по умолчанию для всех числовых полей является float. Ни в одном из полей в моей таблице нет десятичных знаков, и они не являются типом данных money. Это всего 8 цифр. Однако, так как я не хочу, чтобы мой первичный ключ хранился как число с плавающей точкой, когда это int, как я могу это исправить? Это дает мне какую-то ошибку усечения, я выложу шапку экрана при необходимости. Это общая проблема?
Следует отметить, что я не могу импортировать файлы Excel 2007 (я думаю, что нашел решение этой проблемы), но даже когда я пытаюсь импортировать файлы.xls, каждое значение, содержащее цифры, автоматически импортируется как число с плавающей точкой, и когда я пытаюсь изменить это я получаю ошибку.
7 ответов
Службы SSIS неявно преобразуют типы данных, поэтому вам нужно сделать это явно. Диспетчер соединений Excel может обрабатывать только несколько типов данных, и он пытается сделать правильное предположение на основе первых нескольких строк файла. Это полностью задокументировано в документации служб SSIS.
У вас есть несколько вариантов:
- Измените тип данных назначения на float
- Загрузите в промежуточную таблицу с типом данных float с помощью мастера импорта, а затем
INSERT
в таблицу реального назначения с помощьюCAST
или жеCONVERT
конвертировать данные - Создайте пакет служб SSIS и используйте преобразование " Преобразование данных" для преобразования данных.
Возможно, вы также захотите отметить комментарии в документации мастера импорта о сопоставлениях типов данных.
Продолжая то, что сказал Derloopkat, который все еще может потерпеть неудачу при преобразовании (без обид Derloopkat), потому что Excel ужасен в этом:
- Вставьте из Excel в Блокнот и сохраните как обычно (TXT-файл).
- Из Excel откройте указанный.txt файл.
- Выберите следующий, так как он явно разделен табуляцией.
- Выберите "none" для квалификатора текста, затем снова снова.
- Выберите первую строку, удерживайте Shift, выберите последнюю строку и выберите текстовую радиальную кнопку. Нажмите Готово
Он откроется, проверьте его, чтобы убедиться, что он точный, а затем сохраните как файл Excel.
Есть обходной путь.
- Импортировать лист Excel с числами в формате с плавающей запятой (по умолчанию).
- После импорта, Перейти к Table-Design
- Измените тип данных столбца с Float на Int или Bigint.
- Сохранить изменения
- Измените DataType столбца с Bigint на любой тип текста (Varchar, nvarchar, text, ntext и т. Д.)
- Сохранить изменения.
Вот и все.
Когда Excel находит смешанные типы данных в одном и том же столбце, он угадывает, какой формат подходит для столбца (большинство значений определяет тип столбца), и отклоняет все остальные значения, вставляя значения NULL. Но Excel делает это очень плохо (например, если столбец считается текстом, а Excel находит число, а затем решает, что число является ошибкой, и вместо него вставляет NULL, или, если некоторые ячейки, содержащие числа, имеют формат текста, можно получить значения NULL. в целочисленный столбец базы данных).
Решение:
- Создайте новый лист Excel с именем столбцов в первой строке
- Отформатируйте столбцы как текст
- Вставьте строки без формата (используйте формат CVS или скопируйте / вставьте в Блокноте, чтобы получить только текст)
Обратите внимание, что форматирование столбцов на существующем листе Excel недостаточно.
Кажется, есть действительно простое решение при работе с проблемами типов данных.
Как правило, в конце строки подключения Excel добавьте ;IMEX=1;"
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\YOURSERVER\shared\Client Projects\FOLDER\Data\FILE.xls;Extended Properties="EXCEL 8.0;HDR=YES;IMEX=1";
Это решит проблемы с типом данных, такие как столбцы, где значения смешиваются с текстом и числами.
Чтобы перейти к свойству соединения, щелкните правой кнопкой мыши диспетчер соединений Excel под потоком управления и выберите свойства. Это будет справа под решением обозревателя. Надеюсь, это поможет.
Чтобы избежать поля типа float простым способом:
- Откройте лист Excel.
- Вставьте пустую строку после строки заголовка и введите (любой текст) во все ячейки.
- Щелкните правой кнопкой мыши заголовок столбцов, которые вызывают проблему с плавающей точкой, и выберите (Форматировать ячейки), затем выберите категорию (Текст) и нажмите ОК.
А затем экспортируйте лист Excel на свой SQL-сервер.
Этот простой способ сработал со мной.
Обходной путь, чтобы рассмотреть в крайнем случае:
- сохраните копию файла excel, измените столбец, чтобы форматировать его как текст
- скопируйте значения столбца и вставьте в текстовый редактор, сохраните файл (назовите его tmp.txt).
- измените данные в текстовом файле, чтобы они начинались и заканчивались символом, чтобы механизм импорта SQL Server распознавал текст. Если у вас есть модный редактор, используйте прилагаемые инструменты. Я использую awk в cygwin на моем ноутбуке с Windows. Например, я начинаю конец и заканчиваю значение столбца одинарной кавычкой, например "$ awk '{print" \ x27 "$ 1" \ x27 "}'./tmp.txt>./tmp2.txt"
- скопируйте и вставьте данные из tmp2.txt поверх нужного столбца в файле Excel и сохраните файл Excel
- запустите импорт sql server для вашего измененного файла Excel... не забудьте проверить, что выбранный импортером тип данных не является числовым... если это так, повторите описанные выше шаги с другим набором символов
Данные в базе данных будут иметь кавычки после завершения импорта... вы можете обновить данные позже, чтобы удалить кавычки, или использовать функцию "replace" в вашем запросе на чтение, например "replace ([dbo]"). [MyTable]. [MyColumn], '' '', '')"