Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ошибка преобразования типа данных

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

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

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

6 ответов

9 Решение Pondlife [2012-03-21 19:26:00]

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

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

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

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

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

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

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

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

  • Создайте новый новый лист excel с именем столбцов в первой строке
  • Отформатируйте столбцы как текст
  • Вставьте строки без формата (используйте формат CVS или скопируйте/вставьте в Блокнот, чтобы получить только текст)
Читать еще:  Ошибка 5 1

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

2 Shahbaz [2014-11-25 13:56:00]

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

  • Импортировать лист excel с числами как float (по умолчанию).
  • После импорта, Goto Table-Design
  • Измените DataType столбца с Float на Int или Bigint
  • Сохранить изменения
  • Изменить DataType столбца из Bigint на любой текстовый тип (Varchar, nvarchar, text, ntext и т.д.)
  • Сохранить изменения.

Кажется, что это действительно простое решение при решении проблем с типом данных.

В принципе, в конце строки подключения Excel добавьте ;IMEX=1;»

Это приведет к решению проблем типа данных, таких как столбцы, в которых значения смешаны с текстом и номерами.

Чтобы получить доступ к свойству подключения, щелкните правой кнопкой мыши на диспетчере соединений Excel ниже потока управления и нажмите свойства. Это будет направо в разделе explorer. Надеюсь, что это поможет.

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

  • сохранить копию файла excel, изменить столбец для форматирования типа «текст»
  • скопируйте значения столбца и вставьте в текстовый редактор, сохраните файл (назовите его tmp.txt).
  • изменить данные в текстовом файле для начала и конца символом, чтобы механизм импорта SQL Server распознал текст. Если у вас есть модный редактор, используйте включенные инструменты. Я использую awk в cygwin на моем ноутбуке Windows. Например, я начинаю заканчивать значение столбца одной цитатой, например » $awk» ./tmp.txt > ./tmp2.txt «
  • скопируйте и вставьте данные из tmp2.txt поверх нужного столбца в файле excel и сохраните файл excel
  • запустите импорт sql-сервера для вашего измененного файла excel. убедитесь, что дважды проверьте тип данных, выбранный импортером, не является числовым. если это так, повторите вышеуказанные шаги с помощью другого набора символов

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

Ошибка преобразования типа данных

Получаю следующую ошибку преобразования типа данных при запросе.
Вариант №1.
ADOCommand.CommandText := «INSERT INTO Table1 (Pole1) Values (100.45);
ADOCommand.Execute;
Pole1 — типа float.
Все замечательно работает.

Вариант №2.
Edit1.Text := «100.45»;
ADOCommand.CommandText := «INSERT INTO Table1 (Pole1) Values (» + Edit1.Text + «)»;
ADOCommand.Execute;
Не работает.
Ошибка: «100.45» is not a valid floating point value.

Может проблема в длительных Новогодних праздниках?


dioman © ( 2006-01-09 11:53 ) [1]


> Может проблема в длительных Новогодних праздниках?


Fay © ( 2006-01-09 12:05 ) [2]

2 VadimSpb (09.01.06 11:36)
не верю


VadimSpb ( 2006-01-09 12:11 ) [3]

Я очень хочу этому не верить.
Но, бытие определяет сознание.


Fay © ( 2006-01-09 12:27 ) [4]

2 VadimSpb (09.01.06 12:11) [3]
Это космические лучи. Сто пудов 8)


Anatoly Podgoretsky © ( 2006-01-09 12:33 ) [5]

VadimSpb (09.01.06 11:36)
Ты где то нас обманываешь


tech © ( 2006-01-09 14:37 ) [6]

ADOCommand.CommandText := «INSERT INTO Table1 (Pole1) Values (» + Trim(Edit1.Text) + «)»;


Fay © ( 2006-01-09 14:52 ) [7]

2 tech © (09.01.06 14:37) [6]
Попробуйте
ADOCommand.CommandText := «INSERT INTO Table1 (Pole1) Values ( 100.45 )»;


Desdechado © ( 2006-01-09 14:56 ) [8]

используй параметры и все будет ок
проблема в непонимании разделителя целой и дробной части
на клиенте и сервере они могут быть разные, причем как понастройкам ОС, так и сервера БД


Fay © ( 2006-01-09 15:00 ) [9]

2 Desdechado © (09.01.06 14:56) [8]
На сервере всегда точка. В «100.45» тоже точка. Видимо, не очень разные.


Anatoly Podgoretsky © ( 2006-01-09 15:51 ) [10]

Desdechado © (09.01.06 14:56) [8]
Ну он вроде как пишет, что точка, но думаю обманывает.


Dioman © ( 2006-01-09 15:52 ) [11]

в обоих примерах на сервер идут одинаковые строки.


sniknik © ( 2006-01-09 16:00 ) [12]

> в обоих примерах на сервер идут одинаковые строки.
если выполняется тот код, что показан нам. (. )

но думаю он опустил разные «несущественные» (с его точки зрения) детали, и мы здесь видим совершенно не то, что у него выполняется (и дает ошибку), т.е. он нас попросту обманывает. или «разводит» (что тоже возможно).


VadimSpb ( 2006-01-09 16:23 ) [13]

Да-а, уж и не думал, что в обмане обвинят . :-((
Мне совсем не до смеха, дурка полная. В отладчике вижу две одинаковые стринги. Пример простой, поробуйте сами.
А запятую там в принципе нельзя ставить — это и ежу ясно.


dioman © ( 2006-01-09 16:25 ) [14]


VadimSpb ( 2006-01-09 16:27 ) [15]

Очень полезный совет. Часто помогает?


Fay © ( 2006-01-09 16:40 ) [16]

2 VadimSpb (09.01.06 16:23) [13]
> Пример простой, поробуйте сами
Всё ОК


parovoZZ © ( 2006-01-09 16:41 ) [17]

Я тут мимо пробегал.
Может ОН думает, что это не текст, а цифры. Или наоборот. Гы. А может ему фиолетово?


Dioman © ( 2006-01-09 16:46 ) [18]


> VadimSpb (09.01.06 16:27) [15]
>
> Очень полезный совет. Часто помогает?
>

не часто, но может помочь 😉


VadimSpb ( 2006-01-09 16:53 ) [19]


> Я тут мимо пробегал.
> Может ОН думает, что это не текст, а цифры. Или наоборот.
> Гы. А может ему фиолетово?

Будете проходить мимо — проходите мимо.


VadimSpb ( 2006-01-09 19:49 ) [20]

Однако, сделал. Всем спасибо.
«Забытых» процессов не было, проверил сразу.
Все проще и одновременно грустнее.
Просто заменил Edit на новый — и все!
Похоже, что это результат перехода с D7 на D2005. Уже не в первый раз сталкиваюсь с тупыми проблемами (напр. поведение MessageBox, пришлось переписать на API и пр., а оказалось лечится SP1,2,3).
В Accesse как-то проходило, а сейчас правлю под SQL SERVER вот и полезло.


Desdechado © ( 2006-01-09 20:03 ) [21]

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


VadimSpb ( 2006-01-09 20:14 ) [22]

Забавно было видеть именно ошибку преобразования типа данных.
Это откуда? Формируется и передается именно стринга.


sniknik © ( 2006-01-09 20:18 ) [23]

> В Accesse как-то проходило, а сейчас правлю под SQL SERVER вот и полезло.
ни Access ни MSSQL здесь ни причем,
ошибка:
> «xxxxxx» is not a valid floating point value.
дельфевая, это ошибка преобразования строки к флоату (EConvertError). преобразований в коде ([0]) нет. делаем вывод — эта часть «опущена как несущственная»
в MSSQL было бы (на преобразование)
Error converting data type xxxxxx to float
а в Access типа
Несоответствие типов данных в выражении условия отбора
делаем следующий вывод — ты до сих пор пытаешся «пудрить нам мозги» списывая собственные промахи на «неведомый подземный стук».


sniknik © ( 2006-01-09 20:22 ) [24]

советую всеже приводить код as is, и с запасом +- несколько строк, а не только то что сами считаете важным «избранное так сказать», очищая с вашей точки зрения «шелуху» убираете и то что пытаетесь донесть (если бы знали, что именно нужно, то сами бы легко разпознали ошибку, а раз не распознали. ).


VadimSpb ( 2006-01-09 20:24 ) [25]


> делаем следующий вывод — ты до сих пор пытаешся «пудрить
> нам мозги» списывая собственные промахи на «неведомый подземный
> стук».

Жаль что встретил определенное непонимание.
Каждый может делать свои выводы.

Ссылка на основную публикацию
Adblock
detector