SSIS, как преобразовать строку (DT_STR) в деньги (DT_CY), если в источнике более 2 десятичных знаков - PullRequest
2 голосов
/ 16 января 2012

У меня есть исходный плоский файл со значениями, такими как 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 ]

1 голос
/ 28 января 2012

Плоский файл по умолчанию для всех полей DT_STR. Используйте опцию Advanced при редактировании соединения, чтобы иметь числовое поле как float (DT_R4). Затем в расширенном редактировании источника плоских файлов (на вкладке Поток данных) установите для этого выходного столбца значение money (DT_CY).

Затем поле будет преобразовано без каких-либо дополнительных преобразований. Проблема оставляла определение исходного файла как DT_STR.

1 голос
/ 19 августа 2013

По некоторым причинам в моем сценарии 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 было столбцомname.

К моему большому удивлению, это решило проблему, поскольку я понял, что мой OLE DB Destination теперь отправляет данные в виде строки, что SQL Server прекрасно понимает.

Я уверен, что это ошибка!Я использовал SQL Server 2008, поэтому он мог быть решен в более поздних выпусках.Тем не менее, я считаю весьма критичным, что такая важная вещь не работает правильно!

1 голос
/ 24 января 2012

Если у вас нет нулевого значения, используйте Преобразование данных и убедитесь, что у вас нет забавного символа (например, ошибка в 200 долларов США)

Если у вас есть пустые или пустые поля в вашем поле, и вы используете источник плоских файлов, убедитесь, что вы отметили «Вернуть нулевое значение из источника ..»

Еще один трюк, который я использовал, выглядит примерно так: (taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)). в преобразовании «Производный столбец» (вы можете просто заменить поле)

Обычно SSIS не конвертирует пустые строки в деньги должным образом.

...