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 не пуст.