SSIS, как преобразовать строку (DT_STR) в деньги (DT_CY), когда источник имеет более двух знаков после запятой

У меня есть исходный плоский файл со значениями, например 24.209991, но их нужно загрузить в SQL Server как деньги. В 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. Получается ошибка приведения.


person thursdaysgeek    schedule 16.01.2012    source источник
comment
Вы используете назначение ADO.NET? Я просто попробовал использовать место назначения OLE DB, и у меня не было проблем.   -  person Eric    schedule 17.01.2012
comment
Источник плоского файла, место назначения OLE DB. Нет проблем, а? Что я делаю неправильно?!   -  person thursdaysgeek    schedule 17.01.2012


Ответы (3)


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

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

person thursdaysgeek    schedule 27.01.2012

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

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

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

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

person Reza    schedule 23.01.2012

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

person Mathias Lykkegaard Lorenzen    schedule 19.08.2013
comment
Кажется, что преобразования SSIS Derived Column работают с десятичной запятой вместо точки. (это довольно трагично, поскольку преобразования типов SSIS в большинстве других мест работают с десятичными точками, а не с запятыми) Итак, я думаю, проблема в вашем случае заключалась в нескольких запятых в исходной строке, которые SSIS не мог понять. Преобразование в DT_CY после того, как вы заменили запятые точками, возможно, сработало бы - person Tamás Bárász; 23.04.2020