Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4906
В одном скрипте идет конвертация данных в Varchar в Numeric.
Столкнулся с такой проблемой:
Если значение поля = '0,' - кто-то внес косячные данные, то получалась ошибка конвертации:
автор
Ошибка при преобразовании типа данных varchar к numeric

При этом
select ISNUMERIC('0,')
возвращает 1.
Мне просто нужно делать отчет по ошибкам, чтобы отсылать менеджеру.
Хотелось бы отфильтровывать косячные записи не like '%,%',а какой-то функцией типа ISNUMERIC.

Вопрос, это косяк ms sql или я что-то не понимаю?

Версия:
автор
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

---
Проходя мимо разложенных граблей, ты теряешь драгоценный опыт. (с)
19 окт 16, 11:41    [19798807]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
пьяный тюлень
Member

Откуда:
Сообщений: 100
Это косяк SQL. Значение '0,' конвертится только к типу money, но isnumeric возвращает 1.

В MSSQL 2012 появилась замечательные функции try_cast и try_convert, в восьмерке придется все делать самому.
19 окт 16, 11:47    [19798855]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
пьяный тюлень
Это косяк SQL
Ишь ты! А мужики-то не знают!

Однако, поискать-то было легко:

ошибка при конвертации
19 окт 16, 11:55    [19798927]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4906
пьяный тюлень
Это косяк SQL. Значение '0,' конвертится только к типу money, но isnumeric возвращает 1.

В MSSQL 2012 появилась замечательные функции try_cast и try_convert, в восьмерке придется все делать самому.

ясно, спасибо.
19 окт 16, 11:55    [19798930]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4906
iap
пьяный тюлень
Это косяк SQL
Ишь ты! А мужики-то не знают!

Однако, поискать-то было легко:

ошибка при конвертации

Спасибо, буду знать
19 окт 16, 11:57    [19798951]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
invm
Member

Откуда: Москва
Сообщений: 9404
Megabyte
Мне просто нужно делать отчет по ошибкам, чтобы отсылать менеджеру.
declare @t table (v varchar(30));

insert into @t values ('0'), ('0, ');

select
 t.v
from
 @t t cross apply
 (select cast('' as xml).value('xs:decimal(sql:column("t.v"))', 'numeric')) a(v)
where
 t.v is not null and a.v is null;
19 окт 16, 12:10    [19799053]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
пьяный тюлень
Это косяк SQL. Значение '0,' конвертится только к типу money, но isnumeric возвращает 1.
Почему косяк? isnumeric показывает, можно ли сконвертить к одному из числовых типов. Так что всё правильно работает.
Конечно, этой функции недостаточно, так что раньше приходилось использовать like, а недавно вот появились try_cast и try_convert.
19 окт 16, 12:50    [19799301]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
ппп-пп
Guest
alexeyvg
пьяный тюлень
Это косяк SQL. Значение '0,' конвертится только к типу money, но isnumeric возвращает 1.
Почему косяк? isnumeric показывает, можно ли сконвертить к одному из числовых типов. Так что всё правильно работает.
Конечно, этой функции недостаточно, так что раньше приходилось использовать like, а недавно вот появились try_cast и try_convert.


Сконвертировать чем? CAST? или мифическим корвертером?
У людей возникают затруднения потому что вроде бы как ISNUMERIC = True, а CAST вроде бы кидает ошибку.
19 окт 16, 15:09    [19800251]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
ппп-пп,

не TRUE, а 1.
ISNUMERIC помогает проконтролировать, правильный ли набор символов в строке,
правильная ли последовательность символов (например, не разрываются ли цифры пробелами,
где стоят знаки - или + и т.д.). Без этой функции геморроя добавилось бы.
В параметрах ISNUMERIC() нет указания на конкретный тип для конвертации.
Так что на каком основании следует надеяться на корректное конвертирование именно в DEC()?
Документация лишь гарантирует преобразуемость в один из числовых типов...
19 окт 16, 15:21    [19800335]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
ппп-пп
Сконвертировать чем? CAST? или мифическим корвертером?
У людей возникают затруднения потому что вроде бы как ISNUMERIC = True, а CAST вроде бы кидает ошибку.
Да, сконвертировать CAST.
ISNUMERIC = True, и CAST нормально конвертирует.
Можно было бы и самому проверить.
select isnumeric('0,'), cast('0,' as money)
19 окт 16, 17:48    [19801239]     Ответить | Цитировать Сообщить модератору
 Re: Несоответствие работы ISNUMERIC и CAST(... AS numeric(...))  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
iap
Без этой функции геморроя добавилось бы.
По моему, она только добавляет геморроя :-)
Нужно было или сделать параметр в виде типа данных, или вообще функции не делать...
19 окт 16, 17:49    [19801247]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить