Você deve usar
CAST()
ou TRY_CAST()
em vez de:declare @test nvarchar(8) = '12345678'
select cast(@test as bigint) -- errors on failure
select try_cast(@test as bigint) -- returns null on failure
Além disso, é importante destacar o
ISNUMERIC()
não é perfeito. Dos docs
:
ISNUMERIC retorna 1 para alguns caracteres que não são números, como mais (+), menos (-) e símbolos de moeda válidos, como o cifrão ($). Para obter uma lista completa de símbolos de moeda, consulte money and smallmoney (Transact-SQL).
Por esta razão, não acho que a verificação lógica tenha valor aqui. Melhor usar
TRY_CAST()
em todos os valores, independentemente da presença de caracteres e manipular a resposta nula de maneira previsível.