Con respecto a tu pensamiento posterior.
SQL Server 2012 presenta TRY_CONVERT
por esta necesidad. Entonces, la siguiente consulta devolvería NULL
en lugar de un error.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
No hay garantía, incluso con los planes en serie, de que el WHERE
la cláusula ocurrirá antes de SELECT
se evalúa. Como se explica en esta publicación de blog
desde SQL Server 2005 en adelante, es más probable que esto suceda que en versiones anteriores. Los Cambios de comportamiento en las características del motor de base de datos en SQL Servidor 2005
menciona específicamente esto de la siguiente manera.
Hay más discusión sobre este comportamiento en otra buena publicación de blog de Craig Freedman Conversión y errores aritméticos .
En versiones anteriores a 2012 y TRY_CONVERT
necesitas envolver el CAST AS FLOAT
en un CASE
declaración. por ejemplo
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Esto todavía no está absolutamente garantizado para evitar que obtenga errores como ISNUMERIC
en sí mismo solo verifica que el valor se convertiría en uno de los tipos de datos numéricos en lugar de flotar específicamente -1/7400335#7400335">Un ejemplo de una entrada que fallaría es '.'
CASE
está documentado principalmente como cortocircuito en libros en línea (algunas excepciones se analizan aquí
)
También puede encontrar discusiones/quejas adicionales sobre esto en el elemento de conexión SQL Server no debería generar errores ilógicos y un buena explicación de un problema similar por SQLKiwi