Dies wird nicht-numerische Werte auf 0 Standard und wird keine weitere Erklärung erforderlich:
SELECT CASE
WHEN ISNUMERIC(myvarcharcolumn)=1 THEN
CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.'))
ELSE 0 END AS myfloatcolumn
Die REPLACE() Funktionsaufruf verwendet wird Kommas auf Zeiträume zu ändern. Kommas werden in einigen Kulturen als Dezimaltrennzeichen verwendet (z. B. "1,25" anstelle von "1,25"), aber wenn Ihr Server nicht mit einer dieser als Standardkultur eingerichtet ist, gibt ISNUMERIC() 1 zurück, aber CONVERT () wird einen Fehler auslösen. Diese bedeutet bedeutet, dass Ihre Zeichenfolgen keine Kommas als Tausendertrennzeichen verwenden sollten, aber in den meisten Fällen ist ein Komma für einen Dezimal-Platzhalter wahrscheinlicher ein Dezimal-Platzhalter.
Der Aufruf von LTRIM (RTRIM()) ist, da ISNUMERIC() 1 für eine Zeichenfolge mit führenden oder abschließenden Leerzeichen zurückgeben wird, aber CONVERT() kann nicht mit ihnen umgehen. Also, Sie müssen Ihre Saiten trimmen.
Das einzige verbleibende potenzielle Problem ist, dass ISNUMERIC() 1 zurückgibt, wenn die Zahl als int, Währung, Dezimalzahl oder Gleitkommazahl dargestellt werden kann, aber Sie nur in eine Gleitkommazahl konvertieren. Realistisch gesehen, kann ein Float alles speichern, was Sie darauf werfen, aber wenn Sie stattdessen versuchen, zu einem int zu konvertieren, würde ISNUMERIC() 1 für einen Wert wie "2.5" zurückgeben, aber CONVERT (int, '2.5') immer noch einen Fehler werfen.
TRY CATCH passt nicht in meine Lösung, da ich eingeschränkt bin und keine zusätzlichen Anweisungen hinzufügen kann. Ich denke, zusätzliche Funktion hinzufügen, die Casting sicher tun wird.Etwas wie "myconvert (type, data, default value)", frage ich mich, ob es eine andere Möglichkeit gibt, die mich von der benutzerdefinierten Funktion in die Datenbank hinzufügen würde. – AndrewG
+1 für TRY..CATCH - das ist wirklich der Weg! –
"SELECT CASE" in der folgenden Antwort ist besser und flexibler als TRY ... CATCH. – TamusJRoyce