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

error al convertir varchar a float

Significa que tiene al menos una fila en la tabla que no se puede convertir a float . Haciendo el CASE es seguro, pero combinar el CTE y agregar una cláusula WHERE cae en una falacia común de los programadores cuando escriben T-SQL:ese orden de declaración implica un orden de ejecución . Los programadores están acostumbrados al estilo de procedimiento imperativo de los lenguajes similares a C y no logran comprender la naturaleza declarativa basada en conjuntos de SQL. He escrito antes sobre este problema y he dado ejemplos cuando la falacia provoca errores:

Una vez que publique su código completo, podemos ver dónde cometió exactamente la falacia en su caso y asumió un cierto orden de ejecución.

después de la actualización

OK, tengo que administrar que en su caso el código es correcto en el orden de ejecución, el result la columna no se puede proyectar sin evaluar primero el CASE . Si el CASO hubiera estado en una cláusula WHERE, las cosas habrían sido diferentes.

Su problema es diferente:ISNUMERIC . Esta función tiene una comprensión muy generosa de lo que NUMERIC significa y ha mordido a muchos desarrolladores antes. Es decir, acepta valores que CAST y CONVERT rechazarán. Como los que contienen una coma:

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;

Entonces tienes valores que pasan el ISNUMERIC prueba pero falla al convertir. Solo un aviso, cuanto más profundice en este enfoque, más puertas cerradas encontrará. Simplemente no es una forma segura de hacer el lanzamiento que necesita en el lado del servidor. Idealmente, arregle el modelo de datos (haga que el campo sea flotante si almacena flotantes). Aparte de eso, clasifique los datos y elimine todos los valores que no sean un valor flotante adecuado, y corrija el front-end/aplicación para que ya no introduzca nuevos, luego agregue una restricción que activará el error si aparecen nuevos valores incorrectos. No podrá resolver esto en una consulta, ese camino está lleno de cuerpos.

Con la próxima versión de SQL Server tendrá una nueva función, TRY_CONVERT , eso resolvería tu problema.