IsNumeric zwraca 1, jeśli wartość varchar można przekonwertować na DOWOLNY typ liczbowy. Obejmuje to int, bigint, dziesiętny, numeryczny, rzeczywisty i zmiennoprzecinkowy.
Notacja naukowa może być przyczyną problemu. Na przykład:
Declare @Temp Table(Data VarChar(20))
Insert Into @Temp Values(NULL)
Insert Into @Temp Values('1')
Insert Into @Temp Values('1e4')
Insert Into @Temp Values('Not a number')
Select Cast(Data as bigint)
From @Temp
Where IsNumeric(Data) = 1 And Data Is Not NULL
Istnieje sztuczka, której możesz użyć z IsNumeric, aby zwracała 0 dla liczb z notacją naukową. Możesz zastosować podobną sztuczkę, aby zapobiec wartościom dziesiętnym.
IsNumeric(TwojaKolumna + 'e0')
IsNumeric(TwojaKolumna + '.0e0')
Wypróbuj.
SELECT CAST(myVarcharColumn AS bigint)
FROM myTable
WHERE IsNumeric(myVarcharColumn + '.0e0') = 1 AND myVarcharColumn IS NOT NULL
GROUP BY myVarcharColumn