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

Откуда:
Сообщений: 104760
Верблюд
В чем тогда сокральный смысл функции isnumeric ?

Это вы вложили в нее смысл обязательной конвертации к одному типу numeric
Верблюд
узнать, что число можно сконвертировать во что-то, и тут же напороться на ошибку конвертации?

Типа вы не можете напороться на ошибку конвертации в пределах одного типа ?
select cast(9999.9999 as numeric(2,1)) для вас наверное тоже баг ?
14 ноя 12, 14:15    [13472066]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Glory
select cast(9999.9999 as numeric(2,1)) для вас наверное тоже баг ?


не держите меня за идиота.
14 ноя 12, 14:17    [13472084]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Glory
select cast(9999.9999 as numeric(2,1)) для вас наверное тоже баг ?


или это щас тож багом обзовут:

print 'раз'
print round(0.94, 1); 
print 'два'
print round(0.95, 1); 
14 ноя 12, 14:18    [13472095]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Knyazev Alexey
или это щас тож багом обзовут


по делу есть что сказать, клоун?
14 ноя 12, 14:19    [13472110]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
iap
Member

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


ну я не знаю как еще это называть :) В базу из внешнего источника сконвертированны данные. Среди нормальных числе есть такие вот "наборы", которые не являются числами. При расчете надо исключить все значения, которые не могут быть преобразованы в numeric(38,4)... в том числе 0,271 подпадает под этот критерий. КАК? Писать руками список допустимых символов? 0123456789.e+- и т.п. ?
Я же ссылку дал, по которой как раз и перебираю допустимые символы 13471969

Там же я сам впервые (для себя) догадался, что ISNUMERIC() помогает проверять правильный порядок
допустимых символов и допустимое количество некоторых из них.
В то время как LIKE позволяет проверить наличие хотя бы одного недопустимого символа.
14 ноя 12, 14:19    [13472119]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
не держите меня за идиота.

Т.е.
select cast('0,271' as numeric(5,1)) - это баг,
а select cast(9999.9999 as numeric(5,1)) - уже не баг ?
14 ноя 12, 14:20    [13472121]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
iap
Я же ссылку дал, по которой как раз и перебираю допустимые символы 13471969

Там же я сам впервые (для себя) догадался, что ISNUMERIC() помогает проверять правильный порядок
допустимых символов и допустимое количество некоторых из них.
В то время как LIKE позволяет проверить наличие хотя бы одного недопустимого символа.


спасибо. придется извращаться с лайком.
14 ноя 12, 14:20    [13472126]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Верблюд
что число можно сконвертировать во что-то, и тут же напороться на ошибку конвертации?


Переходить на 2012. TRY_CONVERT
14 ноя 12, 14:20    [13472129]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
по делу есть что сказать, клоун?

Идите лучше на ПТ, жертва плохого форумного поиска
14 ноя 12, 14:20    [13472131]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Glory
Верблюд
не держите меня за идиота.

Т.е.
select cast('0,271' as numeric(5,1)) - это баг,
а select cast(9999.9999 as numeric(5,1)) - уже не баг ?


Я конвертирую значение в самое большое из возможных представлений с фиксированной точкой : numeric(38,x). Потому что прекрасно понимаю, что select cast(9999.9999 as numeric(5,1)) - не баг.

PS: По делу есть что сказать?
14 ноя 12, 14:23    [13472164]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
pkarklin
Верблюд
что число можно сконвертировать во что-то, и тут же напороться на ошибку конвертации?


Переходить на 2012. TRY_CONVERT


спасибо, но нам на уровень совместимости 100 дай бог выйти хотя бы через пару лет :)

Ну и помимо этого

автор
TRY_CONVERT возвращает значение в указанном типе data_type; если происходит ошибка, возвращается значение NULL. Однако в случае, если будет запрошено явно запрещенное преобразование, функция TRY_CONVERT возвратит ошибку.
14 ноя 12, 14:26    [13472189]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
Потому что прекрасно понимаю, что select cast(9999.9999 as numeric(5,1)) - не баг.

Ну как же так, мне ISNUMERIC(9999.9999), а сконвертировать я не могу
"В чем тогда сокральный смысл функции isnumeric " ????
Неужели, чтобы "узнать, что число можно сконвертировать во что-то, и тут же напороться на ошибку конвертации?"
14 ноя 12, 14:28    [13472203]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
pkarklin
Member

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

автор
TRY_CONVERT возвращает значение в указанном типе data_type; если происходит ошибка, возвращается значение NULL. Однако в случае, если будет запрошено явно запрещенное преобразование, функция TRY_CONVERT возвратит ошибку.


Ну так у Вас тип данных с разрешенным преобразованием. ДА и запрещенных для numeric не так уж и много.
14 ноя 12, 14:32    [13472242]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Glory
Ну как же так, мне ISNUMERIC(9999.9999), а сконвертировать я не могу


Глори, ты понимаешь, что задаешь идиотский вопрос, и всеравно его задаешь. Еще пример с делением на 0 привел бы
14 ноя 12, 14:34    [13472259]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
pkarklin
Ну так у Вас тип данных с разрешенным преобразованием. ДА и запрещенных для numeric не так уж и много.


Да, спасибо.
14 ноя 12, 14:36    [13472270]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
Глори, ты понимаешь, что задаешь идиотский вопрос, и всеравно его задаешь. Еще пример с делением на 0 привел бы

Я понимаю, что кто-то требует от функции 100ой гарантии правильности конвертации к заранее неизвестному типу. Вот это я лично называю идиотизмом.
14 ноя 12, 14:39    [13472301]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
конечно логичнее было бы иметь вместо одной функции набор вида:
isint
ismoney
isfloat
isnumeric
issignedint
issignedmoney
и т.д. до полной победы
но, что имеем то имеем...
14 ноя 12, 14:43    [13472346]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

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


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

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


и ни какого лайка
14 ноя 12, 14:47    [13472386]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Верблюд
Кто-то написал функцию "ни о чем", работающую "ни как" и включил ее в набор функций сервера, стоимостью в несколько тысяч долларов. Ну да, конечно я идиот, требуя от нее невозможного. Спасибо за вправку мозга.

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

Откуда: Moscow
Сообщений: 31429
Верблюд
Кто-то написал функцию "ни о чем", работающую "ни как" и включил ее в набор функций сервера, стоимостью в несколько тысяч долларов. Ну да, конечно я идиот, требуя от нее невозможного.
Почему "идиот"? Более удобные функции ведь сделали в новой версии.

Просто это не было настолько приоритетной задачей; в конце концов, convert и проверка формата требуется только для очистки/импорта данных, и может решаеться друнгими методами. Вот и оставляли долго исходную функцию от Sybase (хотя более критичные вещи переделавали намного быстрее)

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

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

да, наверное я просто зажрался... пару лет пользовался другими продуктами и стал слишком зажратым :) к хорошему быстро привыкаешь.

сделал так:

create function [dbo].[decimal384]
(
	@str varchar(max)
)
returns decimal(38,4)
as
begin
return 
	cast(
		case when isnumeric(nullif(@str, '')) = 1 then 
			case when nullif(@str, '') like '%e%' then cast(nullif(@str, '') as float) 
			else nullif(replace(@str, ',', ''), '')
			end 
		end
	as numeric(38,4));
end;


Всем спасибо.
14 ноя 12, 15:08    [13472588]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Сергей Мишин
Member

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

dbo.decimal384('$1000') выдаст ошибку
14 ноя 12, 15:46    [13473099]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Верблюд
Member

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

dbo.decimal384('$1000') выдаст ошибку


спасибо. у меня нет значений со знаком $.
14 ноя 12, 16:10    [13473359]     Ответить | Цитировать Сообщить модератору
 Re: Баг isnumeric?  [new]
Antoshka
Member

Откуда:
Сообщений: 828
напишите свою CLR-функцию, которая в случае ошибки тихо возвращает null. А в ней конвертируйте как угодно
14 ноя 12, 16:30    [13473525]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить