Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
автор
print @@VERSION
print ISNUMERIC('0,271')
select cast('0,271' as numeric(38,4))


Microsoft SQL Server 2008 R2 (SP1) - 10.50.2789.0 (X64)
Sep 28 2011 17:10:21
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

1
Msg 8114, Level 16, State 5, Line 3
Error converting data type varchar to numeric.


На мой взгляд - явный баг. Есть другие мнения?
14 ноя 12, 13:54    [13471832]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37051
Правда?
print @@VERSION
print ISNUMERIC('0,271')
select cast('0,271' as money)


Сообщение было отредактировано: 14 ноя 12, 13:57
14 ноя 12, 13:56    [13471861]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Гавриленко Сергей Алексеевич
Правда?
print @@VERSION
print ISNUMERIC('0,271')
select cast('0,271' as money)


И? Мне нужно 38,4 - там числа лежат огромные, в money не влезут
14 ноя 12, 13:59    [13471896]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
и да,

автор
select cast('0,271' as money)

--
271.00


271 чего? Что означает '0,' в числовом формате?!
14 ноя 12, 14:01    [13471909]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
В MONEY запятая может быть разделителем разрядов.
В NUMERIC таких разделителей не бывает. Значит, имеется в виду десятичная точка.
MSSQL в этом качестве хочет видеть только точку, и ничего больше.
Поэтому можно и так:
SELECT CAST(REPLACE('0,271',',','.') AS NUMERIC(38,4))
14 ноя 12, 14:01    [13471915]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Верблюд,

Разделитель целой и дробной части для MS SQL точка.
14 ноя 12, 14:03    [13471922]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Из BOL:

автор
Determines whether an expression is a valid numeric type.

Transact-SQL Syntax Conventions

Syntax

ISNUMERIC ( expression )


автор
ISNUMERIC returns 1 when the input expression evaluates to a valid numeric data type; otherwise it returns 0. Valid numeric data types include the following:

int
numeric
bigint
money
smallint
smallmoney
tinyint
float
decimal
real


select cast('0,271' as numeric)
--
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
14 ноя 12, 14:03    [13471930]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
pkarklin
Верблюд,

Разделитель целой и дробной части для MS SQL точка.


Я понимаю. Поэтому данное число не numeric. Тем не менее ISNUMERIC возвращает 1
14 ноя 12, 14:04    [13471936]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Верблюд
и да,

автор
select cast('0,271' as money)

--
271.00


271 чего? Что означает '0,' в числовом формате?!
Например, '$500,238,545.78'
14 ноя 12, 14:04    [13471941]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
На мой взгляд - явный баг. Есть другие мнения?

ISNUMERIC returns 1 when the input expression evaluates to a valid numeric data type; otherwise it returns 0. Valid numeric data types include the following:
int
numeric
bigint
money
smallint
smallmoney
tinyint
float
decimal
real
14 ноя 12, 14:04    [13471945]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37051
Еще раз. isnumeric вернет 1, если можно отконвертить хотя бы в 1 numeric-тип, а не во все разом.
14 ноя 12, 14:05    [13471946]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
iap
В MONEY запятая может быть разделителем разрядов.
В NUMERIC таких разделителей не бывает. Значит, имеется в виду десятичная точка.
MSSQL в этом качестве хочет видеть только точку, и ничего больше.
Поэтому можно и так:
SELECT CAST(REPLACE('0,271',',','.') AS NUMERIC(38,4))


'0,271' - не число, а перечисление. Вы же предлагаете преобразовать его в число, что не верно.
14 ноя 12, 14:05    [13471951]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
потому что 0 - число
14 ноя 12, 14:05    [13471955]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
Я понимаю. Поэтому данное число не numeric. Тем не менее ISNUMERIC возвращает 1

Потому что валидных типов больше, чем один нужный конкретно вам numeric
14 ноя 12, 14:05    [13471956]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37051
Верблюд
'0,271' - не число, а перечисление. Вы же предлагаете преобразовать его в число, что не верно.
Какое еще нафиг перечисление? O_o
14 ноя 12, 14:06    [13471963]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Верблюд
pkarklin
Верблюд,

Разделитель целой и дробной части для MS SQL точка.


Я понимаю. Поэтому данное число не numeric. Тем не менее ISNUMERIC возвращает 1
ISNUMERIC возвращает 1, если строка может быть преобразована в один из числовых типов
(INT, SMALLINT, TINYINT, DEC, NUMERIC, MONEY, SMALLMONEY, FLOAT)
ошибка при конвертации
14 ноя 12, 14:06    [13471969]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
'0,271' - не число, а перечисление. Вы же предлагаете преобразовать его в число, что не верно.

В MSSQL нет никаких перечеслений. А числовых типов больше, чем один
14 ноя 12, 14:06    [13471971]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
iap
Например, '$500,238,545.78'


хммм... логично, чо. сначала создать проблему в виде разделителя разрядов, потом сказать, что это число, потом отказаться конвертировать его в число. Все в стиле MS
14 ноя 12, 14:07    [13471975]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
хммм... логично, чо. сначала создать проблему в виде разделителя разрядов, потом сказать, что это число, потом отказаться конвертировать его в число. Все в стиле MS

В MS просто различают больше числовых типов, чем вы.
14 ноя 12, 14:08    [13471989]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Гавриленко Сергей Алексеевич
Верблюд
'0,271' - не число, а перечисление. Вы же предлагаете преобразовать его в число, что не верно.
Какое еще нафиг перечисление? O_o


ну я не знаю как еще это называть :) В базу из внешнего источника сконвертированны данные. Среди нормальных числе есть такие вот "наборы", которые не являются числами. При расчете надо исключить все значения, которые не могут быть преобразованы в numeric(38,4)... в том числе 0,271 подпадает под этот критерий. КАК? Писать руками список допустимых символов? 0123456789.e+- и т.п. ?
14 ноя 12, 14:09    [13472004]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37051
Верблюд
Гавриленко Сергей Алексеевич
пропущено...
Какое еще нафиг перечисление? O_o


ну я не знаю как еще это называть :) В базу из внешнего источника сконвертированны данные. Среди нормальных числе есть такие вот "наборы", которые не являются числами. При расчете надо исключить все значения, которые не могут быть преобразованы в numeric(38,4)... в том числе 0,271 подпадает под этот критерий. КАК? Писать руками список допустимых символов? 0123456789.e+- и т.п. ?
Проверяйте лайком. Тема - баян.
14 ноя 12, 14:10    [13472016]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Glory
Верблюд
хммм... логично, чо. сначала создать проблему в виде разделителя разрядов, потом сказать, что это число, потом отказаться конвертировать его в число. Все в стиле MS

В MS просто различают больше числовых типов, чем вы.


В чем тогда сокральный смысл функции isnumeric ? узнать, что число можно сконвертировать во что-то, и тут же напороться на ошибку конвертации?
14 ноя 12, 14:11    [13472024]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Гавриленко Сергей Алексеевич
Проверяйте лайком. Тема - баян.
я уверен что тема баян. просто поиск нынче на sql.ru работает как-то не очень
14 ноя 12, 14:12    [13472038]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37051
Верблюд
В чем тогда сокральный смысл функции isnumeric ? узнать, что число можно сконвертировать во что-то, и тут же напороться на ошибку конвертации?
В чем ее смысл - написано в документации.
14 ноя 12, 14:12    [13472040]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Гавриленко Сергей Алексеевич
Верблюд
В чем тогда сокральный смысл функции isnumeric ? узнать, что число можно сконвертировать во что-то, и тут же напороться на ошибку конвертации?
В чем ее смысл - написано в документации.


ну да, как же я сразу не догадался. функция ради функции. чтоб была. смысл в этом...
14 ноя 12, 14:14    [13472064]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить