Для начала, ISNUMERIC
- ужасная функция, она не дает хороших результатов; это часто неправильно. Если вы попробуете ISNUMERIC('1.1001562717e+011')
, вы заметите, что вы получите значение 1
, однако, CONVERT(numeric(13,1),'1.1001562717e+011')
выдаст ошибку. Гораздо лучшая функция - TRY_CONVERT
(или TRY_CAST
), которая возвращает NULL
, если преобразование не выполнено для спецификатора c типа данных: TRY_CONVERT(numeric(13,1),'1.1001562717e+011')
.
Существо здесь действительно важно указать c для типа данных, так как ISNUMERIC
может (неверно) предполагать, что значение может быть преобразовано как минимум в 1 из числовых c типов данных; но это не значит, что все они. Для типов данных scientifi c единственным типом данных, который вы можете преобразовать, является float
/ real
:
SELECT TRY_CONVERT(numeric(13,1),'1.1001562717e+011') AS Numeric,
TRY_CONVERT(bigint,'1.1001562717e+011') AS int,
TRY_CONVERT(float,'1.1001562717e+011') AS float,
TRY_CONVERT(money,'1.1001562717e+011') AS money;
Обратите внимание, что здесь значение имеет только float
. Если вы хотите numeric
в качестве конечного значения, вам нужно CONVERT
значение дважды:
CONVERT(numeric(13,1),TRY_CONVERT(float,'1.1001562717e+011'))