Ошибка преобразования типов данных при импорте из Excel в SQL Server 2008

Каждый раз, когда я пытаюсь импортировать файл Excel в SQL Server, я получаю конкретную ошибку. Когда я пытаюсь редактировать сопоставления, значением по умолчанию для всех числовых полей является float. Ни в одном из полей в моей таблице нет десятичных знаков, и они не являются типом данных money. Это всего 8 цифр. Однако, так как я не хочу, чтобы мой первичный ключ хранился как число с плавающей точкой, когда это int, как я могу это исправить? Это дает мне какую-то ошибку усечения, я выложу шапку экрана при необходимости. Это общая проблема?

Следует отметить, что я не могу импортировать файлы Excel 2007 (я думаю, что нашел решение этой проблемы), но даже когда я пытаюсь импортировать файлы.xls, каждое значение, содержащее цифры, автоматически импортируется как число с плавающей точкой, и когда я пытаюсь изменить это я получаю ошибку.

http://imgur.com/4204g

7 ответов

Решение

Службы SSIS неявно преобразуют типы данных, поэтому вам нужно сделать это явно. Диспетчер соединений Excel может обрабатывать только несколько типов данных, и он пытается сделать правильное предположение на основе первых нескольких строк файла. Это полностью задокументировано в документации служб SSIS.

У вас есть несколько вариантов:

  • Измените тип данных назначения на float
  • Загрузите в промежуточную таблицу с типом данных float с помощью мастера импорта, а затем INSERT в таблицу реального назначения с помощью CAST или же CONVERT конвертировать данные
  • Создайте пакет служб SSIS и используйте преобразование " Преобразование данных" для преобразования данных.

Возможно, вы также захотите отметить комментарии в документации мастера импорта о сопоставлениях типов данных.

Продолжая то, что сказал Derloopkat, который все еще может потерпеть неудачу при преобразовании (без обид Derloopkat), потому что Excel ужасен в этом:

  1. Вставьте из Excel в Блокнот и сохраните как обычно (TXT-файл).
  2. Из Excel откройте указанный.txt файл.
  3. Выберите следующий, так как он явно разделен табуляцией.
  4. Выберите "none" для квалификатора текста, затем снова снова.
  5. Выберите первую строку, удерживайте Shift, выберите последнюю строку и выберите текстовую радиальную кнопку. Нажмите Готово

Он откроется, проверьте его, чтобы убедиться, что он точный, а затем сохраните как файл Excel.

Есть обходной путь.

  1. Импортировать лист Excel с числами в формате с плавающей запятой (по умолчанию).
  2. После импорта, Перейти к Table-Design
  3. Измените тип данных столбца с Float на Int или Bigint.
  4. Сохранить изменения
  5. Измените DataType столбца с Bigint на любой тип текста (Varchar, nvarchar, text, ntext и т. Д.)
  6. Сохранить изменения.

Вот и все.

Когда Excel находит смешанные типы данных в одном и том же столбце, он угадывает, какой формат подходит для столбца (большинство значений определяет тип столбца), и отклоняет все остальные значения, вставляя значения NULL. Но Excel делает это очень плохо (например, если столбец считается текстом, а Excel находит число, а затем решает, что число является ошибкой, и вместо него вставляет NULL, или, если некоторые ячейки, содержащие числа, имеют формат текста, можно получить значения NULL. в целочисленный столбец базы данных).

Решение:

  1. Создайте новый лист Excel с именем столбцов в первой строке
  2. Отформатируйте столбцы как текст
  3. Вставьте строки без формата (используйте формат 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 простым способом:

  1. Откройте лист Excel.
  2. Вставьте пустую строку после строки заголовка и введите (любой текст) во все ячейки.
  3. Щелкните правой кнопкой мыши заголовок столбцов, которые вызывают проблему с плавающей точкой, и выберите (Форматировать ячейки), затем выберите категорию (Текст) и нажмите ОК.

А затем экспортируйте лист Excel на свой SQL-сервер.

Этот простой способ сработал со мной.

Обходной путь, чтобы рассмотреть в крайнем случае:

  1. сохраните копию файла excel, измените столбец, чтобы форматировать его как текст
  2. скопируйте значения столбца и вставьте в текстовый редактор, сохраните файл (назовите его tmp.txt).
  3. измените данные в текстовом файле, чтобы они начинались и заканчивались символом, чтобы механизм импорта SQL Server распознавал текст. Если у вас есть модный редактор, используйте прилагаемые инструменты. Я использую awk в cygwin на моем ноутбуке с Windows. Например, я начинаю конец и заканчиваю значение столбца одинарной кавычкой, например "$ awk '{print" \ x27 "$ 1" \ x27 "}'./tmp.txt>./tmp2.txt"
  4. скопируйте и вставьте данные из tmp2.txt поверх нужного столбца в файле Excel и сохраните файл Excel
  5. запустите импорт sql server для вашего измененного файла Excel... не забудьте проверить, что выбранный импортером тип данных не является числовым... если это так, повторите описанные выше шаги с другим набором символов

Данные в базе данных будут иметь кавычки после завершения импорта... вы можете обновить данные позже, чтобы удалить кавычки, или использовать функцию "replace" в вашем запросе на чтение, например "replace ([dbo]"). [MyTable]. [MyColumn], '' '', '')"

Другие вопросы по тегам