Frage

Ich habe eine SQL Server 2000 -Datenbank mit einer Spalte vom Typ varchar (255). Alle Daten sind entweder null oder numerische Daten mit bis zu zwei Präzisionspunkten (z. B. 11,85 '). Ich habe versucht, die folgende T-SQL-Abfrage auszuführen, aber den Fehler "Fehlerkonvertieren des Datentyps varchar in Numerikum" erhalten jedoch.

SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];

Ich habe eine spezifischere Besetzung ausprobiert, die ebenfalls fehlgeschlagen ist.

SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];

Ich habe auch Folgendes ausprobiert, um festzustellen, ob Daten nicht numerisch sind und die einzigen zurückgegebenen Werte null waren.

SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;

Ich habe versucht, auf andere Datentypen wie Float und Geld umzuwandeln, aber nur Geld war erfolgreich. Also habe ich Folgendes ausprobiert:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

... was gut funktioniert hat. Irgendwelche Ideen, warum die ursprüngliche Abfrage fehlgeschlagen ist? Wird es ein Problem geben, wenn ich zuerst in Geld und dann in Dezimalheit umwandle?

Vielen Dank!

War es hilfreich?

Lösung

Es ist wahrscheinlich, dass dies davon abhängt, ob das Dezimalsymbol ein Komma oder ein Punkt ist. Hier sind einige Testfragen und ihre Ergebnisse:

select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1

Die Dokumentation für Isnumerisch sagt:

Isnumeric gibt 1 zurück, wenn der Eingangsausdruck eine gültige Ganzzahl, eine schwimmende Punktnummer, ein Geld oder eine Dezimalart bewertet. Ansonsten gibt es 0 zurück

Beide 3.6 und 3,6 kann zugegossen werden money, darum isnumeric('3,6') kehrt zurück 1.

Um dieses Problem zu beheben, ersetzen Sie die Kommas durch Punkte (oder umgekehrt, wenn Ihr System Komma als Dezimalsymbol verwendet):

select cast(replace('3,6',',','.') as decimal)

Eine andere Möglichkeit besteht darin, das "Dezimalesymbol" in Windows zu ändern. Es befindet sich im Konfigurationsfeld -> Regional und Sprache -> Formate -> Zusätzliche Einstellungen -> Zahlen.

Andere Tipps

Eine andere Ursache sind leere Saiten. Wenn Sie beispielsweise den Import -Assistenten zum Importieren einer CSV -Datei verwenden, werden leere Felder zu leeren Zeichenfolgen, nicht Nulls.

Dies ist eine gemeinsame Idiom, um dies zu beheben:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))

Wählen Sie Cast (isnull (mycolumn, 0) als Dezimalzahl (4,2)) aus [mytable];

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top