Преобразование / приведение nVarChar с разделителем запятых к десятичному

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

Теперь, когда заявления об отказе от ответственности ...

Один из наших файлов провайдеры недавно изменили способ представления денежной суммы с «12345,67» до «12, 345,67» . Наш SQL, который преобразует значение, выглядит как SELECT FLOOR (CAST ([inputValue] AS DECIMAL (24,10))) и больше не работает. То есть запятая прерывает приведение.

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

Спасибо за ваши идеи.

7
задан SethO 18 August 2010 в 19:01
поделиться

4 ответа

попробуйте использовать REPLACE (Transact-SQL) :

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

ВЫХОД:

12345.67

, так что это будет:

SELECT FLOOR( CAST(REPLACE([input value],',','') AS DECIMAL(24,10)))
8
ответ дан 6 December 2019 в 21:08
поделиться

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

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

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

2
ответ дан 6 December 2019 в 21:08
поделиться

ВЫБРАТЬ ЭТАЖ (CAST (REPLACE ([inputValue], ',', '') AS DECIMAL (24,10)))

1
ответ дан 6 December 2019 в 21:08
поделиться

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

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

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

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

1
ответ дан 6 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: