Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fehler beim Konvertieren von varchar in Float

Das bedeutet, dass Sie mindestens eine Zeile in der Tabelle haben, die nicht in float umgewandelt werden kann . Den CASE ausführen ist sicher, aber das Kombinieren des CTE und das Hinzufügen einer WHERE-Klausel fällt in einen verbreiteten Irrtum von Programmierern beim Schreiben von T-SQL:Diese Deklarationsreihenfolge impliziert eine Ausführungsreihenfolge . Programmierer sind an den imperativen prozeduralen Stil von C-ähnlichen Sprachen gewöhnt und verstehen die deklarative mengenbasierte Natur von SQL nicht. Ich habe zuvor über dieses Problem geschrieben und Beispiele gegeben, wann der Trugschluss Fehler verursacht:

Sobald Sie Ihren vollständigen Code posten, können wir sehen, wo genau Sie in Ihrem Fall den Irrtum gemacht und eine bestimmte Ausführungsreihenfolge angenommen haben.

nach dem Update

OK, also muss ich admin sein, dass in Ihrem Fall der Code in der Reihenfolge der Ausführung korrekt ist, das result Spalte kann nicht projiziert werden, ohne vorher den CASE auszuwerten . Hätte sich CASE in einer WHERE-Klausel befunden, wären die Dinge anders gelaufen.

Ihr Problem ist anders:ISNUMERIC . Diese Funktion hat ein sehr großzügiges Verständnis dessen, was NUMERIC ist bedeutet und hat schon viele Entwickler gebissen. Es akzeptiert nämlich Werte, die CAST und CONVERT ablehnen. Wie diejenigen, die ein Komma enthalten:

declare @n varchar(8000) = '1,000';
select isnumeric(@n);
select cast(@n as float);
select case when isnumeric(@n)=1 then cast(@n as float) else null end;

Sie haben also Werte, die den ISNUMERIC übergeben testen, aber nicht konvertieren. Nur eine Warnung, je mehr Sie sich mit diesem Ansatz befassen, desto mehr verschlossene Türen werden Sie finden. Ist einfach kein sicherer Weg, um die Umwandlung durchzuführen, die Sie auf der Serverseite benötigen. Korrigieren Sie im Idealfall das Datenmodell (machen Sie das Feld zu einem Float, wenn es Floats speichert). Kurz davor, sortieren Sie die Daten und entfernen Sie alle Werte, die kein richtiger Float sind, und reparieren Sie das Frontend/die Anwendung, um keine neuen einzuführen, und fügen Sie dann eine Einschränkung hinzu, die den Fehler auslöst, wenn neue schlechte Werte auftreten. Sie können dies nicht in einer Abfrage lösen, diese Straße ist mit Leichen übersät.

Mit der nächsten Version von SQL Server haben Sie eine neue Funktion, TRY_CONVERT , das würde Ihr Problem lösen.