In Bezug auf Ihre Nachdenklichkeit.
SQL Server 2012 führt TRY_CONVERT ein
für dieses Bedürfnis. Die folgende Abfrage würde also NULL zurückgeben eher ein Fehler.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Auch bei seriellen Plänen gibt es keine Garantie, dass der WHERE -Klausel wird vor dem SELECT vorkommen ausgewertet wird. Wie erklärt in diesem Blogbeitrag
Ab SQL Server 2005 tritt dies häufiger auf als in früheren Versionen. Die Verhaltensänderungen an Datenbankmodulfunktionen in SQL Server 2005
ruft dies speziell wie folgt auf.
Weitere Diskussionen zu diesem Verhalten finden Sie in einem anderen guten Blogbeitrag von Craig Freedman Konvertierungs- und Rechenfehler .
Auf Versionen vor 2012 und TRY_CONVERT Sie müssen CAST AS FLOAT umschließen in einem CASE Aussage. z. B.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Dies ist immer noch nicht absolut sicher, dass Sie Fehler als ISNUMERIC erhalten selbst überprüft nur, ob der Wert in einen der numerischen Datentypen umgewandelt wird und nicht speziell in Float Ein Beispiel für eine fehlschlagende Eingabe ist '.'
CASE ist in Online-Büchern als meist kurzgeschlossen dokumentiert (einige Ausnahmen werden hier diskutiert
). )
Weitere Diskussionen/Beschwerden dazu finden Sie auch im Connect-Element SQL Server sollte keine unlogischen Fehler auslösen und ein gute Erklärung eines ähnlichen Problems von SQLKiwi