Ошибка преобразования в производную колонку служб SSIS - PullRequest
0 голосов
/ 24 октября 2018

У меня есть файл .txt в качестве источника, часть представления файла приведена ниже (Все столбцы цены указаны как DT_R4)

Quantity    Partner Share   Customer Price
1           0               0
1           0               0
3           0.7             0.99
2           1.4             1.99
1          -1.4            -1.99

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

(DT_NUMERIC,18,2)((ABS([Customer Price]) - [Partner Share]) / ABS([Customer Price]) * 100)

Если я игнорируюстроки, где цены равны 0, все работает нормально, но они мне тоже нужны: (

У меня есть предположение, что, возможно, это потому, что выражение будет 0/0, но я не знаю, как это исправить.

Ниже приведены ошибки:

[Производный столбец [297]] Ошибка: Произошла ошибка при попытке выполнить приведение типа.

[Производный столбец [297]] Ошибка: код ошибки служб SSIS DTS_E_INDUCEDTRANSFORMFAILUREONERROR. «Компонент« Производный столбец »(297)» не выполнен, поскольку произошел код ошибки 0xC0049064, а расположение строки ошибки в «выходном столбце« Скидка »(376)» указывает на ошибку при ошибке.произошла ошибкана указанный объект указанного компонента.Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

[SSIS.Pipeline] Ошибка: Код ошибки SSIS DTS_E_PROCESSINPUTFAILED.Сбой метода ProcessInput компонента «Производный столбец» (297) с кодом ошибки 0xC0209029 при обработке ввода «Ввод производного столбца» (298).Указанный компонент возвратил ошибку из метода ProcessInput.Ошибка относится только к компоненту, но является фатальной и приводит к остановке выполнения задачи «Поток данных».Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете попытаться использовать Conditional Operator в выражении Derived Column, как показано ниже.

(DT_NUMERIC,18,2)((ABS([Customer Price]) - [Partner Share]) / ABS([Customer Price] == 0 ? 1 : [Customer Price]) * 100)

Надеюсь, это работает для вас.

0 голосов
/ 24 октября 2018

Попробуйте использовать оператор TRY_CAST и ISNULL в случае 0:

(DT_NUMERIC,18,2)((ABS( ISNULL(TRY_CAST([Customer Price] AS int), 0)) - [Partner Share]) 
     / ABS( ISNULL(TRY_CAST([Customer Price] AS int), 1)) * 100)

Похоже, некоторые строки не могут быть преобразованы в целые числа.Добавьте некоторую обработку ошибок в ваш поток данных и направьте строки ошибок в плоский файл, чтобы вы могли их проверить.

...