Deberías usar CAST()
o TRY_CAST()
en cambio:
declare @test nvarchar(8) = '12345678'
select cast(@test as bigint) -- errors on failure
select try_cast(@test as bigint) -- returns null on failure
Además, es importante señalar el ISNUMERIC()
no es perfecto De los docs
:
ISNUMERIC devuelve 1 para algunos caracteres que no son números, como más (+), menos (-) y símbolos de moneda válidos como el signo de dólar ($). Para obtener una lista completa de los símbolos de moneda, consulte dinero y dinero pequeño (Transact-SQL).
Por esta razón, no creo que la comprobación lógica tenga valor aquí. Es mejor usar TRY_CAST()
en todos los valores, independientemente de la presencia de caracteres y manejar la respuesta nula de manera predecible.