SQL Server CONVERT(NUMERIC(18,0), '') завершается неудачно, но CONVERT(INT, '') завершается успешно?

PRINT CONVERT(NUMERIC(18,0), '')

производит Error converting data type varchar to numeric.

Тем не мение,

PRINT CONVERT(INT, '')

производит 0 без ошибок...

Вопрос: есть ли для этого какой-нибудь флаг SQL Server или мне нужно будет делать операторы case для каждого преобразования varchar в числовое значение? (кроме очевидного почему?)

4 ответа

Решение

Используйте ISNUMERIC

declare @a varchar(20)
set @a = 'notanumber'
select case when isnumeric(@a) = 0 then 0 else convert(numeric(18,0),@a) end

Пустая строка будет преобразована в ноль для типов float и int, но не десятичная. (И конвертируется в 01 января 1900 года для datetime = ноль). Я не знаю почему.. это просто...

Если вам нужно десятичное число (18,0), используйте вместо него bigint. Или сначала разыграть с помощью float

ISNUMERIC примет - а также . а также 1.2E3 как число, но все не удается преобразовать в десятичную.

ISNUMERIC не всегда работает, как вы могли ожидать: в частности, он возвращает True для некоторых значений, которые впоследствии не могут быть преобразованы в числовые.

В этой статье описывается проблема и предлагается, как обойти ее с помощью UDF.

Возможно, старый вопрос, но я столкнулся с этим, когда внезапно мое поле varchar иногда становилось пустым, когда мне также приходилось конвертировать 1000,50 в 1000,50.

Моя хитрость заключается в использовании:

      PRINT CONVERT(NUMERIC(18,0), '0' + replace(replace(myvarchar,',',''),'.',','))

Начальный ноль будет игнорироваться во время преобразования, если myvarchar не пуст.

Другие вопросы по тегам