Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка при использовании типа smallmoney  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Здравствуйте!
Есть таблица UT_Trades с полями Price-тип money и LotCount-тип integer.
Если составить такой запрос, то все правильно отработает:
SELECT Price*LotCount AS C
FROM dbo.UT_Trades
Если же у поля Price поменять тип с money на smallmoney, то тот же запрос выдает ошибку:
Ошибка арифметического переполнения при преобразовании expression к типу данных smallmoney.
Почему же так происходит и можно ли избежать этого?

К сообщению приложен файл. Размер - 0Kb
28 окт 09, 12:48    [7849353]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
Glory
Member

Откуда:
Сообщений: 104760
rsolanov

Если же у поля Price поменять тип с money на smallmoney, то тот же запрос выдает ошибку:
Ошибка арифметического переполнения при преобразовании expression к типу данных smallmoney.
Почему же так происходит и можно ли избежать этого?

А вы читали в хелпе про максимальные значения, которые можно хранить в каждом числовом типе ?
28 окт 09, 12:49    [7849367]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
* (Умножение) (Transact-SQL)
(см. "типы результата")
28 окт 09, 12:53    [7849401]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Паганель
* (Умножение) (Transact-SQL)
(см. "типы результата")

На самом деле я тоже думал о том, что результат будет автоматически неявно приведен к типу smallmoney. Для проверки я менял запрос:
SELECT CAST(Price*LotCount AS DECIMAL(18, 4)) AS C
FROM dbo.UT_Trades
Казалось бы явное приведение результата к типу, который точно подойдет к полученному произведению, должно устранить ошибку, но ошибка осталась.
28 окт 09, 13:05    [7849531]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Glory
rsolanov

Если же у поля Price поменять тип с money на smallmoney, то тот же запрос выдает ошибку:
Ошибка арифметического переполнения при преобразовании expression к типу данных smallmoney.
Почему же так происходит и можно ли избежать этого?

А вы читали в хелпе про максимальные значения, которые можно хранить в каждом числовом типе ?

Конечно читал, с учетом этого они и хранятся в БД.
28 окт 09, 13:07    [7849557]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Вы делаете
rsolanov
явное приведение результата
после умножения.

Попробуйте сделать явное приведение умножаемых выражений до умножения
28 окт 09, 13:09    [7849568]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Паганель
Вы делаете
rsolanov
явное приведение результата
после умножения.

Попробуйте сделать явное приведение умножаемых выражений до умножения

Очевидно что это поможет. Ну что, получается везде, где используется это поле, его необходимо преобразовывать к типу, который подойдет к результату? Вам не кажется что это как то не логично?
Тогда я не понимаю логику SQL SERVER'а. По логике то нужно следить именно за типом результата, чтобы его значение подходило к типу.
28 окт 09, 13:15    [7849634]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
rsolanov
Вам не кажется что это как то не логично?
Кажется
Но ничего поделать не могу
В доке так написано, и не придерешься
28 окт 09, 13:20    [7849677]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
rsolanov
Паганель
Вы делаете
rsolanov
явное приведение результата
после умножения.

Попробуйте сделать явное приведение умножаемых выражений до умножения

Очевидно что это поможет. Ну что, получается везде, где используется это поле, его необходимо преобразовывать к типу, который подойдет к результату? Вам не кажется что это как то не логично?
Тогда я не понимаю логику SQL SERVER'а. По логике то нужно следить именно за типом результата, чтобы его значение подходило к типу.
Типы данных (Transact-SQL)
Приоритет типов данных (Transact-SQL)
28 окт 09, 13:21    [7849681]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
Glory
Member

Откуда:
Сообщений: 104760
rsolanov
Glory
rsolanov

Если же у поля Price поменять тип с money на smallmoney, то тот же запрос выдает ошибку:
Ошибка арифметического переполнения при преобразовании expression к типу данных smallmoney.
Почему же так происходит и можно ли избежать этого?

А вы читали в хелпе про максимальные значения, которые можно хранить в каждом числовом типе ?

Конечно читал, с учетом этого они и хранятся в БД.

И вас не смущает, что вы пытаетесь привысить документрованные ограничения ?
28 окт 09, 13:21    [7849684]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Вам не кажется что это как то не логично?
> Тогда я не понимаю логику SQL SERVER'а.

логика очень простая - тип результата выражения определяется
по типам аргументов. по _типам_, а не по получающемуся при вычислении значению.

Posted via ActualForum NNTP Server 1.4

28 окт 09, 13:21    [7849685]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании типа smallmoney  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Я все понял, большое всем Вам спасибо за помощь.
28 окт 09, 14:26    [7850264]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить