( Jeśli używasz programu SQL Server 2012 lub nowszego, zapoznaj się z odpowiedzią @ wBob, aby uzyskać bardziej przejrzyste podejście. Podejście przedstawione w mojej odpowiedzi poniżej jest wymagane tylko w przypadku korzystania z programu SQL Server 2008 R2 lub starszego ).
Nie potrzebujesz (lub nie chcesz) separatora tysięcy podczas konwersji na NUMERIC
, niezależnie od tego, czy jest to przecinek, kropka czy spacja, więc po prostu pozbądź się ich najpierw. Następnie zamień przecinek na kropkę / dziesiętną i gotowe:
SELECT CONVERT(NUMERIC(10, 2),
REPLACE(
REPLACE('7.000,45', '.', ''),
',', '.'
)
) AS [Converted];
Zwroty:
7000.45
Dla kompletności powinienem wspomnieć, że próbowałem również:
SET LANGUAGE Greek;
Patrząc na różne style formatu dla CONVERT , ale tutaj nic nie ma zastosowania.
Funkcja FORMAT , ale typem danych wejściowych musi być wartość liczbowa lub data / czas / data / godzina (która została wprowadzona w SQL Server 2012, więc nie dotyczy SQL Server 2008 R2 lub starszych).
I nic innego nie działało. Miałem nadzieję znaleźć coś bardziej eleganckiego niż dwa REPLACE
połączenia, ale jak dotąd nie miałem szczęścia.
Ponadto, aby wspomnieć, chociaż nie jest to czyste rozwiązanie T-SQL, można to również osiągnąć za pomocą SQLCLR. Jest też gotowa funkcja, która robi to w bibliotece SQL # (którą napisałem) o nazwie String_TryParseToDecimal . Ta funkcja jest dostępna w wersji darmowej i działa w każdej wersji SQL Server, począwszy od SQL Server 2005:
SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');
Zwroty:
7000.45000000000000000000
W moim przypadku działał następujący kod:
wyjście: 123.456.789,03
źródło
VARCHAR
,NVARCHAR
,CHAR
iNCHAR
typów. Domyślna wartość to 30 w niektórych przypadkach i 1 w innych przypadkach, co powoduje, że kod jest nieusuwalny / podatny na błędy. 2) nie potrzebujesz dokładnego układu podczas używania#
. Potrzebujesz tylko jednej z nich (np.#
) Dla wszystkich cyfr, ale bez separatora tysięcy, lub dwóch z nich oddzielonych przecinkiem (np.#,#
), Aby uzyskać wszystkie cyfry i separator tysięcy. W związku z tymSELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));
zwraca ten sam wynik, co sugerujesz.