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

Другие вопросы по тегам