it-swarm.com.de

Konvertieren Sie numerische Zeichenfolgenwerte mit Komma als Dezimaltrennzeichen in NUMERIC (10, 2).

Ich habe eine SQL-Tabelle mit Varchar-Spalten, die griechisch formatierte Zahlen enthalten (. Als Tausendertrennzeichen und Komma als Dezimaltrennzeichen).

Der klassische Umbau

CONVERT(numeric(10,2),REPLACE([value],',','.'))

funktioniert nicht, weil die. (Tausendertrennzeichen) beendet die Konvertierung

Zum Beispiel versuchen

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

Ich möchte solche Werte in numerische (10,2) konvertieren.

Irgendwelche Vorschläge, wie man damit umgeht?

12
PanosPlat

( Wenn Sie SQL Server 2012 oder neuer verwenden, lesen Sie bitte @ wBobs Antwort für einen saubereren Ansatz. Der in meiner Antwort unten beschriebene Ansatz ist nur erforderlich, wenn Sie SQL Server 2008 R2 verwenden oder älter.)

Sie brauchen (oder wollen) das Tausendertrennzeichen nicht, wenn Sie in NUMERIC konvertieren, 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;

  • Betrachten Sie verschiedene Formatstile für CONVERT , aber hier gilt nichts.

  • Die Funktion FORMAT , 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, ist also nicht anwendbar zu 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, die dies in der Bibliothek SQL # (die ich geschrieben habe) mit dem Namen String_TryParseToDecimal ausführt. 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
10
Solomon Rutzky

Welche Version von SQL Server verwenden Sie? Ab SQL Server 2012 können Sie TRY_PARSE mit seinem USING culture Streit. Sie können auch PARSE verwenden, wobei der Unterschied PARSE fehlschlägt, wenn die Konvertierung fehlschlägt und TRY_PARSE gibt ein NULL zurück, z

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

(test results

HTH

10
wBob

Der folgende Code hat in meinem Fall funktioniert:

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

ausgabe: 123.456.789,03

0
Shahed Adnan