SSIS проблема преобразования данных десятичного - PullRequest
2 голосов
/ 03 мая 2019

У меня есть пакет dtsx, работающий в SSIS на нашем сервере SQL (2016 SP2 CU6), это легкая задача импорта листа Excel (xlsx) в таблицу в SQL как есть, на этом этапе никаких преобразований не требуется, это агентская работа, которая делает гораздо больше, но я вижу, что ошибка происходит именно в этом разделе.

Проблема, с которой я сталкиваюсь, заключается в том, что число в Excel (0.0153) выглядит в SQL, как если бы оно плохо конвертировалось (1.5299999999999999E-2).

Чтобы подтвердить, что число в Excel - 0.0153, а не что-то более длинное или отформатированное, чтобы выглядеть следующим образом.

Both values are just 6 characters in length, formula bar shows actual value

После импорта вот что у меня есть: -

Both values show in SQL

Я нахожу это странным как: -

  • Они оба находятся в очень похожей ситуации, но с разными результатами
  • Они располагаются один за другим в листе Excel
  • Они находятся в верхней части листа (строки 10 и 11), поэтому при выборке следует использовать их для понимания типа данных, если происходит что-то подобное (строка 1 равна 0.193841, что также аналогично, общий диапазон равен От -29 до 200 (до 7 знаков после запятой)
  • Разница между ними всего 0,0021

Числовой формат в Excel - General, а столбец в SQL - NVARCHAR(255)

В пакете служб SSIS исходный тип данных Excel для внешнего столбца классифицируется как double-precision float [DT-R8] (не знаю, откуда это, но я не могу его изменить) и вывод Колонка is Unicode string [DT-WSTR]

Затем я использую Native OLE DB\SQL Server Native Client 11.0 OLD DB Connection для доступа к таблице.

Это простой пакет, но почему это значение так резко возросло. Это не единица, вход имеет около 1700 строк, и мы видим это по ряду строк.

Package layout

1 Ответ

4 голосов
/ 03 мая 2019

В корпоративной среде мы не всегда можем выбрать исходные и конечные данные, а иногда нам просто нужно «заставить их работать».Excel - это настоящий кошмар в SSIS, все, что нужно, это одно неверное изменение входного файла, и ваша работа не выполняется, потому что метаданные больше не совпадают.

Да, в идеале это числовые данные, которые следует хранить вчисловое поле данных (не строковое / символьное поле).

Вот как я выполнил этот сценарий в прошлом, надеюсь, он будет работать в вашей ситуации, но на самом деле зависит от того, какие результирующие данные будут использоватьсяfor.

  1. Добавьте шаг преобразования данных в задачу потока данных, чтобы преобразовать значение с плавающей запятой двойной точности в десятичное (я использовал масштаб = 10)

Data Flow Task Data Conversion - to Decimal 2. Добавьте второй шаг преобразования данных для преобразования десятичного значения обратно в строку Unicode

Data Conversion - to String 3Измените отображение назначения OLE DB, чтобы использовать новый выходной столбец из второй задачи преобразования данных.

Column mapping

Результат:

Database result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...