Я поддерживаю процесс ETL, который преобразует входные данные плоских файлов в таблицу базы данных SqlServer. Код почти на 100% T-SQL и работает внутри БД. Я не владею кодом и не могу изменить рабочий процесс. Я могу только помочь сконфигурировать «переводящий» SQL, который берет данные файла и преобразует их в данные таблицы (подробнее об этом позже).
Теперь, когда заявления об отказе от ответственности ...
Один из наших файлов провайдеры недавно изменили способ представления денежной суммы с «12345,67»
до «12, 345,67»
. Наш SQL, который преобразует значение, выглядит как SELECT FLOOR (CAST ([inputValue] AS DECIMAL (24,10)))
и больше не работает. То есть запятая прерывает приведение.
Учитывая, что мне нужно сохранить окончательное значение как Десятичный (24,10)
тип данных (да, я понимаю, что FLOOR
уничтожает всю точность после запятой - дизайнер не синхронизировался с заказчиком) , что я могу сделать, чтобы эффективно привести эту строку?
Спасибо за ваши идеи.
попробуйте использовать REPLACE (Transact-SQL) :
SELECT REPLACE('12,345.67',',','')
ВЫХОД:
12345.67
, так что это будет:
SELECT FLOOR( CAST(REPLACE([input value],',','') AS DECIMAL(24,10)))
Хотя это не обязательно лучший подход для моей ситуации, я хотел оставить потенциальное решение для будущего использования, которое мы обнаружили при исследовании этой проблемы.
Похоже, что тип данных SqlServer MONEY
может использоваться как прямое преобразование для строк с запятой, разделяющей недесятичную часть. Итак, если SELECT CAST ('12, 345.56 'AS DECIMAL (24,10))
завершается неудачно, SELECT CAST ('12, 345.56' AS MONEY)
будет успешным.
Одно предостережение заключается в том, что тип данных MONEY
имеет точность до 4 десятичных знаков и потребует явного преобразования, чтобы получить его в DECIMAL
, если оно вам понадобится.
ВЫБРАТЬ ЭТАЖ (CAST (REPLACE ([inputValue], ',', '') AS DECIMAL (24,10)))
Это работает для меня:
DECLARE @foo NVARCHAR(100)
SET @foo='12,345.67'
SELECT FLOOR(CAST(REPLACE(@foo,',','') AS DECIMAL(24,10)))
Это, вероятно, действительно только для параметров сортировки / языка и региональных параметров, где запятая не является десятичным разделителем ( например: испанский)