sql >> Base de Datos >  >> RDS >> Sqlserver

incapaz de emitir valor como flotante

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