2012-03-21 1 views
8

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

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

http://imgur.com/4204g

+0

Какой инструмент вы используете для импорта? SSIS? И было бы полезно точно знать, что означает «ошибка какого-то рода». – Pondlife

+0

@ Pondlife, я использую мастер импорта в SSMS. Ссылка на ошибку была отредактирована в исходном сообщении. – wootscootinboogie

ответ

9

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

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

  • Изменить тип данных назначения плавать
  • нагрузки в таблицу «ступенчатого» с типом данных поплавка с помощью мастера импорта, а затем INSERT в реальную таблицу назначения с использованием CAST или CONVERT преобразовать данные
  • Создать пакет SSIS и использовать Data Conversion преобразования для преобразования данных

Вы также можете отметить комментарии в Import Wizard documentation о сопоставлениях типов данных.

+0

Я думал, что мне нужно будет создать «стадионный» стол. Я не хотел прибегать к этому, потому что я подумал, что это kludgey, но если это сработает, я думаю, это сработает. Благодаря! :) – wootscootinboogie

+0

Я сделал промежуточный стол, но все значения, которые не были конвертированы в float, были молча преобразованы в NULL. – ulu

3

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

Решение:

  1. Создать новый Excel лист с именем столбцов в первой строке
  2. Формат столбцов в виде текста
  3. Вставить строки без формата (использование CVS формат или скопировать/вставить в блокнот, чтобы получить только текст)

Обратите внимание, что форматирование столбцов на существующем листе Excel недостаточно.

+0

Та же проблема с вашим решением, она сохранит номер как VarChat, который не работает ... – mejiamanuel57

+1

Все решения, предлагаемые на этой странице, требуют ручного изменения типа столбца. Извините, я предположил, что кто-то знает, как это сделать. Вышеупомянутый вопрос заключался в том, как запретить целочисленные числа стать плавающими, усекаться и т. Д., А точнее, избегать этого сообщения об ошибке «Ошибка преобразования типов данных». – derloopkat

+0

Используя MSSQL 2012 и Office 15.0, это не сработало для меня. SSIS все еще хочет преобразовать столбцы в float. – Lumberjack

7

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

  1. Вставить из Excel в блокнот и сохранить как обычный (.txt файл).
  2. Внутри excel откройте указанный .txt-файл.
  3. Выберите следующий, так как он явно разделен на вкладку.
  4. Выберите «none» для спецификатора текста, затем еще раз.
  5. Выберите первую строку, удерживайте shift, выберите последнюю строку и выберите текстовую радиальную кнопку. Нажмите Finish

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

+0

С вашим решением Он сохранит номер как VarChat, который не работает ... – mejiamanuel57

+1

Ответ derloopkat на ваш комментарий по его вопросу точно суммирует мои мысли – JackArbiter

+0

Это не сработало для меня. В SQL Server 2012 он все еще пытался преобразовать столбец в float. – Lumberjack

2

Существует обходное решение.

  1. Импорт листа Excel с числами как float (по умолчанию).
  2. После импорта Goto Table-Design
  3. Изменение DataType колонки от поплавка к Int или BigInt
  4. Сохранить изменения
  5. Изменение DataType колонки от BigInt к любому типу текста (Varchar, NVARCHAR, текст, ntext и т. д.)
  6. Сохранить изменения.

Всё.

1

Существует действительно простое решение при работе с проблемами типа данных.

В основном, в конце строки соединения 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 ниже потока управления и нажмите свойства. Это будет направо в разделе explorer. Надеюсь, это поможет.

+0

Даже с IMEX = 1, это предполагает, что мое поле является строковым полем и измельчает значимые цифры в числах. Например. мой номер 987654321 становится 9.876543e + 008. Преобразование того, что оно импортировало обратно в число, дает 9876543 ** 00 **, теряя последние две цифры. Взаимодействие Excel с фактическими данными - это полный аборт. Я пытаюсь заставить всех моих клиентов удалить Excel со своих компьютеров, но они все зависимы - психически зависимые sheeple. – DaveBoltman

+0

Интересно. Да, Excel может сильно усугубляться форматированием. https://munishbansal.wordpress.com/2009/12/15/importing-data-from-excel-having-mixed-data-types-in-a-column-ssis/ Это лучший ресурс, который я нашел на эту тему , и должен помочь вам справиться с вашими большими числами. Мне не приходилось возиться с такими цифрами раньше, так что это новый вопрос для меня. – SQLCodingIsFunnn

0

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

  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 для вашего измененного файла excel ... убедитесь, что вы дважды проверяете выбранный тип данных импортером не является числовым ... если это так, повторите вышеуказанные шаги с помощью другого набора символов

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

Смежные вопросы