SSIS, как преобразовать строку (DT_STR) в деньги (DT_CY), если в источнике более 2 десятичных знаков
У меня есть исходный плоский файл со значениями, такими как 24.209991, но их нужно загрузить в SQL Server как тип money. В DTS (из которого я конвертирую) это значение равно 24.21. Как мне преобразовать это поле в SSIS?
Прямо сейчас я просто меняю тип с DT_STR на DT_CY, и он выдает ошибку запуска "Преобразование данных не удалось. Преобразование данных для столбца "Col003" вернуло значение состояния 2 и текст состояния "Значение не удалось преобразовать из-за потенциальной потери данных.".'
Использую ли я задачу преобразования данных? И что потом?
Я также попытался установить исходный столбец вывода в DT_NUMERIC, а затем преобразовать его в DT_CY с тем же результатом.
Я также попытался использовать производные столбцы, приведя поле DT_STR Col003 к (DT_NUMERIC,10,2)Col003, а затем приведя его к (DT_CY)Col003_Numeric. Это получает ошибку приведения.
3 ответа
Плоский файл по умолчанию для всех полей DT_STR. Используйте опцию Advanced при редактировании соединения, чтобы иметь числовое поле как float (DT_R4). Затем в расширенном редактировании источника плоских файлов (на вкладке Поток данных) установите для этого выходного столбца значение money (DT_CY).
Затем поле будет преобразовано без каких-либо дополнительных преобразований. Проблема оставляла определение исходного файла как DT_STR.
Если у вас нет нулевого значения, используйте Преобразование данных и убедитесь, что у вас нет забавного символа (например, ошибка в 200 долларов США)
Если у вас есть пустые или пустые поля в вашем поле, и вы используете плоский файл источника, убедитесь, что вы отметили "Вернуть нулевое значение из источника.."
Другой трюк, который я использовал, это что-то вроде: (taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)).
в преобразовании Производный столбец (вы можете просто заменить поле)
Обычно SSIS не конвертирует пустые строки в деньги должным образом.
По какой-то причине в моем сценарии OLE DB Destination
на самом деле был настроен принять DT_CY
, Однако приведение к этому формату (независимо от длины входных и конечных данных, а также от того, были ли данные NULL
когда он прибыл) всегда вызывал одну и ту же проблему.
После добавления средств просмотра данных я могу заключить, что это как-то связано с локалью. Здесь, в Дании, мы используем запятую (,
) в качестве десятичных разделителей и точек (.
) как разделители тысяч, а не наоборот.
Это означает, что огромное количество, как 382,939,291,293.38
будет (после преобразования в DT_CY
) выглядит как 382.939.291.293,38
, Несмотря на то, что я сильно сомневался в том, что это может быть проблемой, я решил сделать противоположное тому, что изначально планировал.
Я решил перейти к расширенным настройкам моего OLE DB Destination
и изменить DT_CY
тип столбца в DT_STR
вместо. Затем я добавил Derived Column
преобразование и ввел следующее выражение для преобразования столбца до того, как данные попадут в пункт назначения.
REPLACE(SUBSTRING(Price, 2, 18), ",", ".")
где Price
было название столбца.
К моему большому удивлению, это решило проблему, так как я понял, что мой OLE DB Destination
теперь отправлял данные в виде строки, что прекрасно понимал SQL Server.
Я уверен, что это ошибка! Я использовал SQL Server 2008, поэтому он мог быть решен в более поздних выпусках. Тем не менее, я считаю весьма критичным, что такая важная вещь не работает правильно!