( Если вы используете SQL Server 2012 или новее, см. Ответ @ wBob для более чистого подхода. Подход, изложенный в моем ответе ниже, требуется только в том случае, если вы используете SQL Server 2008 R2 или более раннюю версию . )
Вам не нужен (или не нужен) разделитель тысяч при преобразовании NUMERIC
, независимо от того, запятая ли это, точка или пробел, поэтому сначала просто избавьтесь от них. Затем преобразуйте запятую в точку / десятичную точку, и все готово:
SELECT CONVERT(NUMERIC(10, 2),
REPLACE(
REPLACE('7.000,45', '.', ''),
',', '.'
)
) AS [Converted];
Возвращает:
7000.45
Для полноты картины должен упомянуть, что я также попробовал:
SET LANGUAGE Greek;
Рассматривая различные стили форматирования для CONVERT , но здесь ничего не применимо.
Функция FORMAT , но тип ввода должен быть числовым или значением даты / времени / даты / времени (оно и было введено в SQL Server 2012, поэтому не применимо к SQL Server 2008 R2 или более ранней версии).
И ничто иное, казалось, не сработало. Я надеялся найти что-то более элегантное, чем два REPLACE
звонка, но пока не повезло.
Кроме того, просто чтобы упомянуть, хотя это и не чисто решение T-SQL, это также может быть достигнуто с помощью SQLCLR. И есть готовая функция, которая делает это в библиотеке SQL # (которую я написал) с именем String_TryParseToDecimal . Эта функция доступна в бесплатной версии и работает в каждой версии SQL Server, начиная с SQL Server 2005:
SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');
Возвращает:
7000.45000000000000000000
Следующий код работал в моем случае:
выход: 123.456.789,03
источник
VARCHAR
,NVARCHAR
,CHAR
иNCHAR
типов. В некоторых случаях значение по умолчанию равно 30, а в других - 1, что означает наличие не поддерживаемого кода, подверженного ошибкам. 2) вам не нужно точное расположение при использовании#
. Вам просто нужен один из них (например#
) для всех цифр, но без разделителя тысяч, или два из них, разделенных запятой (например#,#
), чтобы получить все цифры и разделитель тысяч. Следовательно,SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));
возвращает тот же результат, что вы предлагаете.