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