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

Cómo determinar el valor de campo que no se puede convertir a (decimal, flotante, int) en SQL Server

Simple ISNUMERIC es basura

  • Cadena vacía, + , - y . son todos válidos
  • También lo es +. etc.
  • 1e-3 es válido para flotante pero no decimal (a menos que CAST para flotar y luego para decimal)

Para una solución particularmente críptica pero a prueba de fallas, agregue e0 o .0e0 entonces usar ESNUMÉRICO

SELECT
   ISNUMERIC(MyCOl + 'e0')   --decimal check,
   ISNUMERIC(MyCOl + '.0e0')  --integer check

Entonces

SELECT
    ID, VALUE,
    CAST(
          CASE WHEN ISNUMERIC(VALUE + 'e0') = 1 THEN VALUE ELSE NULL END
          AS decimal(38, 10)
        ) AS ConvertedVALUE
FROM
    Mytable