2010-08-18 2 views
6

Я поддерживаю процесс ETL, который преобразует входы плоских файлов в таблицу базы данных SqlServer. Код составляет почти 100% T-SQL и работает внутри БД. Я не владею кодом и не могу изменить рабочий процесс. Я могу только помочь настроить «перевод» SQL, который принимает данные файла и преобразует его в данные таблицы (подробнее об этом позже).Преобразование/литье nVarChar с разделителем-запятой в десятичное

Теперь о том, что отказ от ответственности вне пути ...

Один из наших поставщиков файлов в последнее время изменилось, как они представляют собой денежную сумму от '12345.67' до '12,345.67'. Наш SQL, который преобразует значение, выглядит как SELECT FLOOR(CAST([inputValue] AS DECIMAL(24,10))) и больше не работает. I., запятая разбивает литой.

Учитывая, что я должен хранить окончательное значение, как Decimal (24,10) тип данных (да, я понимаю, что FLOOR стирает всю точность после десятичной точки - дизайнер не был синхронизирован с заказчиком), что я могу сделать эффективно использовать эту строку?

Благодарим вас за идеи.

+0

все эти ответы решают проблему. –

+0

@KM: Я сейчас обсуждаю эти предложения с нашей группой DBA. С моей точки зрения, общий подход, предложенный (используя Replace()), по-видимому, работает. Скоро будет обновляться. – SethO

ответ

7

попробовать с помощью REPLACE (Transact-SQL):

SELECT REPLACE('12,345.67',',','') 

ВЫВОД:

12345.67 

так было бы:

SELECT FLOOR(CAST(REPLACE([input value],',','') AS DECIMAL(24,10))) 
+0

+1 ... Замените и THEN, так что ваши оригинальные функции сохранены. – Fosco

1

Это работает для меня:

DECLARE @foo NVARCHAR(100) 
SET @foo='12,345.67' 

SELECT FLOOR(CAST(REPLACE(@foo,',','') AS DECIMAL(24,10))) 

Это, вероятно, справедливо только для Collations/культуры, где запятая не десятичный разделитель (т.е. испанский)

+0

Вы поднимаете хороший момент, Дэвид. Я знаю, что некоторые материалы поступают из Европы и Азии - это может испортить любые строковые манипуляции с помощью запятых для пустых строк. Я должен буду следить за клиентом. – SethO

+0

Было бы лучше, если бы ваше приложение обнаружило локаль пользователя, конвертировалось в десятичное число, а затем перешло на sql-сервер в виде десятичного значения. Проблема уходит. – David

1

SELECT FLOOR (CAST(REPLACE([inputValue], ',', '') AS DECIMAL(24,10)))

2

Хотя не обязательно лучший подход к моей ситуации, я хотел бы оставить потенциальное решение для будущего использования, которое мы обнаружили при исследовании этой проблемы.

Похоже, что тип данных SqlServer MONEY может использоваться как прямая трансляция для строк с запятой, разделяющей не десятичную часть. Итак, где SELECT CAST('12,345.56' AS DECIMAL(24,10)) не удается, SELECT CAST('12,345.56' AS MONEY) преуспеет.

Одно из предостережений заключается в том, что тип данных MONEY имеет точность в 4 десятичных разряда и требует явного приведения, чтобы получить его до DECIMAL, если вам это нужно.

Смежные вопросы