Разные культуры имеют разные десятичные и тысячи разделителей. При вызове CONVERT
сервер будет использовать локаль, указанную в параметре LANGUAGE
, чтобы попытаться проанализировать строку. В лучшем случае, если строка и локаль не совпадают, вы получите ошибку. В худшем случае строка будет передана с неверным разделителем.
Учитывая символ $
, похоже, что вы пытаетесь проанализировать числовую строку в американском стиле за пределами США. Решение заключается в использовании PARSE или TRY_PARSE
с en-us
в качестве культуры:
select parse('234.5' as numeric(10,2) using 'en-us')
Вы можете избежать обрезки знака валюты, если сначала разберетесь с деньгами:
select parse('$234.5' as money using 'en-us')
НЕ попробуйте заменить разделители. Это может легко привести к неправильным значениям, а все же не сможет проанализировать текст. Что если значение было 2,345.123
? Даже если вы удалите разделитель тысяч, попытка преобразовать это значение, например, в Германии, приведет к 2345123.00
:
select parse('2345.123' as decimal(10,2) using 'de-DE')
Возвращает:
2345123.00
Вы можете предположить, что это не произойдет в производстве. Как насчет курса евро к доллару? В Италии?
SELECT PARSE('1.12' as decimal(10,2) using 'it-IT')
------
112.00
Oops