Трябва да използвате CAST()
или TRY_CAST()
вместо това:
declare @test nvarchar(8) = '12345678'
select cast(@test as bigint) -- errors on failure
select try_cast(@test as bigint) -- returns null on failure
Също така е важно да се посочи ISNUMERIC()
не е перфектен. От документите
:
ISNUMERIC връща 1 за някои знаци, които не са числа, като плюс (+), минус (-) и валидни валутни символи, като знака за долар ($). За пълен списък с валутни символи вижте пари и малки пари (Transact-SQL).
Поради тази причина не мисля, че логическата проверка е от стойност тук. Най-добре е да използвате TRY_CAST()
за всички стойности, независимо от наличието на знаци и обработвайте нулевия отговор по предвидим начин.