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

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 18 августа 2010

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

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

ВЫХОД:

12345.67

, поэтому будет:

SELECT FLOOR( CAST(REPLACE([input value],',','') AS DECIMAL(24,10)))
2 голосов
/ 19 августа 2010

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

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

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

1 голос
/ 18 августа 2010

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

1 голос
/ 18 августа 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...