Simples ISNUMERIC é lixo
- String vazia,
+
,-
e. são todos válidos
- Assim como
+.
etc 1e-3
é válido para float, mas não decimal (a menos que você CAST para float e depois para decimal)
Para uma solução particularmente enigmática, mas à prova de falhas, anexe
e0
ou .0e0
então use ISNUMERIC SELECT
ISNUMERIC(MyCOl + 'e0') --decimal check,
ISNUMERIC(MyCOl + '.0e0') --integer check
então
SELECT
ID, VALUE,
CAST(
CASE WHEN ISNUMERIC(VALUE + 'e0') = 1 THEN VALUE ELSE NULL END
AS decimal(38, 10)
) AS ConvertedVALUE
FROM
Mytable