( Wenn Sie SQL Server 2012 oder neuer verwenden, finden Sie in der Antwort von @ wBob einen saubereren Ansatz. Der in meiner Antwort unten beschriebene Ansatz ist nur erforderlich, wenn Sie SQL Server 2008 R2 oder älter verwenden. )
Sie brauchen (oder wollen) nicht das Tausendertrennzeichen, wenn Sie in konvertieren NUMERIC
, unabhängig davon, ob es sich um Komma, Punkt oder Leerzeichen handelt. Entfernen Sie sie also zuerst. Dann konvertieren Sie das Komma in einen Punkt / eine Dezimalstelle und Sie sind fertig:
SELECT CONVERT(NUMERIC(10, 2),
REPLACE(
REPLACE('7.000,45', '.', ''),
',', '.'
)
) AS [Converted];
Kehrt zurück:
7000.45
Der Vollständigkeit halber sollte ich erwähnen, dass ich auch versucht habe:
SET LANGUAGE Greek;
Betrachtet man verschiedene Formatstile für CONVERT , so gilt hier nichts.
Die FORMAT- Funktion, aber der Eingabetyp muss ein numerischer Wert oder ein Wert für Datum / Uhrzeit / Datum / Uhrzeit sein (dieser und dieser wurde in SQL Server 2012 eingeführt und gilt daher nicht für SQL Server 2008 R2 oder älter).
Und sonst schien nichts zu funktionieren. Ich hatte gehofft, etwas eleganteres als zwei REPLACE
Anrufe zu finden, aber bisher kein solches Glück.
Um nur zu erwähnen, dass dies keine reine T-SQL-Lösung ist, kann dies auch über SQLCLR erreicht werden. Und es gibt eine vorgefertigte Funktion in der SQL # -Bibliothek (die ich geschrieben habe) mit dem Namen String_TryParseToDecimal . Diese Funktion ist in der kostenlosen Version verfügbar und funktioniert in jeder Version von SQL Server ab SQL Server 2005:
SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');
Kehrt zurück:
7000.45000000000000000000
Der folgende Code hat in meinem Fall funktioniert:
Ausgabe: 123.456.789,03
quelle
VARCHAR
,NVARCHAR
,CHAR
, undNCHAR
Typen. Der Standardwert ist in einigen Fällen 30 und in anderen Fällen 1, was zu nicht wartbarem / fehleranfälligem Code führt. 2) Sie benötigen nicht das genaue Layout, wenn Sie verwenden#
. Sie benötigen nur eine davon (z. B.#
) für alle Ziffern, aber kein Tausendertrennzeichen, oder zwei von ihnen durch ein Komma getrennt (z. B.#,#
), um alle Ziffern und das Tausendertrennzeichen zu erhalten. Gibt daherSELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));
die gleiche Ausgabe zurück, die Sie vorschlagen.