Aumi 20 / 35 / 14 Регистрация: 08.10.2015 Сообщений: 406 |
||||||||
1 |
||||||||
Ошибка арифметического переполнения05.02.2018, 12:38. Показов 11927. Ответов 3 Метки нет (Все метки)
Здравствуйте, Есть таблица1 (idtovar, price,amount,itog)
В таблице заполнены все столбцы, кроме itog. Есть процедура, которая заполняет этот столбец
если я в таблицу добавлю одну строчку и выполню процедуру, то ошибки нет. Код Сообщение 8115, уровень 16, состояние 2, процедура UpdateSumDelta, строка 43 Ошибка арифметического переполнения при преобразовании expression к типу данных smallmoney. Выполнение данной инструкции было прервано. Откуда взялось expression? Как бороться с ошибкой?
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
05.02.2018, 12:38 |
3 |
1109 / 754 / 182 Регистрация: 27.11.2009 Сообщений: 2,252 |
|
05.02.2018, 12:49 |
2 |
Откуда взялось expression? Amount*Price
В таблице заполнены все столбцы, кроме itog. А зачем что-то хранить, если можно просто сделать вычисляемое поле itog AS Amount*Price??
0 |
20 / 35 / 14 Регистрация: 08.10.2015 Сообщений: 406 |
|
05.02.2018, 12:51 [ТС] |
3 |
iap, У меня участвуют небольшие цены, поэтому взяла smallmoney.
Лучше MONEY или DEC(длина, точность) подходящего размера это вместо float использовать?
0 |
1109 / 754 / 182 Регистрация: 27.11.2009 Сообщений: 2,252 |
|
05.02.2018, 13:00 |
4 |
Сообщение было отмечено Aumi как решение РешениеПриоритет типов данных (Transact-SQL) Добавлено через 2 минуты
iap, У меня участвуют небольшие цены, поэтому взяла smallmoney. это вместо float использовать? Я ж говорю, лучше не далать itog постоянным полем, а сделать вычисляемым. Добавлено через 3 минуты
iap, У меня участвуют небольшие цены, поэтому взяла smallmoney. Результат умножения будет приведён к типу сомножителя с бОльшим приритетом типа.
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
05.02.2018, 13:00 |
4 |
Создал представление, содержащее следующий запрос:
SELECT TOP (100) PERCENT dbo.заявки_рас.ДатаПоступления + dbo.заявки_рас.ВремяПоступления AS datetime_add, dbo.дома.УК AS uk,
dbo.заявки_рас.ВидРабот AS type_work
FROM dbo.дома INNER JOIN
dbo.заявки_рас ON dbo.дома.АдресДома = dbo.заявки_рас.АдресДома
WHERE (dbo.заявки_рас.ОтметкаУдалить = 0) AND (dbo.заявки_рас.ЗаявкаВыполнена = 1) OR
(dbo.заявки_рас.ОтметкаУдалить IS NULL)
ORDER BY datetime_add
И в результате получаю ошибку, упомянутую в сабже. В mssql разбираюсь плохо, подскажите где искать проблему? Индексов в таблице «заявки_рас» нету (сначала думал из за них, тк все началось после операций с пересозданием индекса).
Если убрать
dbo.заявки_рас.ДатаПоступления + dbo.заявки_рас.ВремяПоступления AS datetime_add,
…то вроде работает, но для правильного результата необходимо всетаки сложить эти два времени.
задан 16 сен 2011 в 11:02
0
Скорее всего, это связано с тем, что у вас колонки dbo.заявки_рас.ВремяПоступления
и dbo.заявки_рас.ДатаПоступления
имеют тип smalldatetime
. Чтобы не было такой ошибки, нужно привести данные к типу datetime
.
Но меня немного смущает метод сложения дат.
Пример. Дата 2007-05-08 12:35:00 + дата ‘2007-05-08 14:35:00 выдаст 2114-09-13 03:10:00.000, то есть складываются все составляющие дат.
Возможно, тут лучше использовать datediff метод.
ответ дан 16 сен 2011 в 12:46
3
SELECT
DATEPART(YEAR, dateTimeStamp) AS [Year]
, DATEPART(MONTH, dateTimeStamp) AS [Month]
, COUNT(*) AS NumStreams
, [platform] AS [Platform]
, deliverableName AS [Deliverable Name]
, SUM(billableDuration) AS NumSecondsDelivered
Предполагая, что ваш цитируемый текст является точным текстом, один из этих столбцов не может выполнять математические вычисления, которые вам нужны. Дважды щелкните ошибку, и она выделит строку, которая вызывает проблемы (если она отличается от опубликованной, ее может не быть); Я проверил ваш код с переменными, и проблем не возникло, а это означает, что один из этих столбцов (о котором мы не знаем более конкретной информации) создает эту ошибку.
Одно из ваших выражений должно быть приведено/преобразовано в int, чтобы это произошло, что является значением Arithmetic overflow error converting expression to data type int
.
фпк1сл
31.01.16 — 21:52
Добрый день!
Конфигурация УТ 11.1.10.145, платформа 8.3.6.2237, SQL Server 2008.
При проведении документа «Расчет себестоимости товаров» за апрель, выскакивает ошибка
Ошибка при выполнении обработчика — ‘ОбработкаПроведения’
по причине:
{Документ.РасчетСебестоимостиТоваров.МодульОбъекта(2181)}: Ошибка при вызове метода контекста (ВыполнитьПакет)
Выборка = Запрос.ВыполнитьПакет()[1].Выбрать();
по причине:
Ошибка выполнения запроса
по причине:
Ошибка при выполнении операции над данными:
Microsoft SQL Server Native Client 10.0: Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.
HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1
Все другие документы проводятся нормально. Подскажите пожалуйста, все чем может быть проблема, куда смотреть?
фпк1сл
1 — 31.01.16 — 21:53
Я понимаю, что где-то в результате запроса получается большое число, вот только как найти, откуда это число возникает?
cw014
2 — 01.02.16 — 07:37
Пройтись отладчиком + ТИИ
фпк1сл
3 — 01.02.16 — 11:57
Отладчик мне ничего не покажет, программа завершается в момент Выборка = Запрос.ВыполнитьПакет()[1].Выбрать(); , значит я не узнаю, что её выбивает. В файловом варианте база тоже не запускается, размер слишком большой.
Timon1405
4 — 01.02.16 — 12:04
обновитесь, говорят, на 11.1.10.150 проблема уходит.
Михаил Козлов
5 — 01.02.16 — 12:14
(3) Можно попробовать в консоли удалять из пакета по 1. Или выполнять по 1.
Карупян
6 — 01.02.16 — 12:16
профайлером (или тж) засечь запрос и посмотреть
фпк1сл
7 — 01.02.16 — 15:21
Обновляться буду в крайнем случае, попробую в технологическом журнале посмотреть на криминал. Профайлером не имею представления как пользоваться.
фпк1сл
8 — 02.02.16 — 16:16
Обновление не дало результатов. В ТЖ и профайлер смотрел — ничего не понял. Подскажите, может по какому нибудь регистру посмотреть какие нибудь значения подозрительные?
mikecool
9 — 02.02.16 — 16:19
(8) первый запрос из пакета генерит не перевариваемое число — посмотри, какие там числовые поля и попытайся понять, откуда мб такое большое
Timon1405
10 — 02.02.16 — 17:16
(8) поищите большой ресурс «ПостояннаяРазница» в регистре ВыручкаИСебестоимостьПродаж в консоли запросов
Tateossian
11 — 02.02.16 — 18:37
(0) Скорее всего, это происходит где-то при делении, попробуй все такие места явно обработать через ВЫРАЗИТЬ( КАК ЧИСЛО(xx,yy))
Cyberhawk
12 — 02.02.16 — 18:53
ИР тебе в помощь — там и разбивка запроса на подзапросы, и отбор ТЖ по конкретному запросу
фпк1сл
13 — 03.02.16 — 09:26
(11) В том то дело, все место обработаны через Выразить, запрос полностью типовой.
// 0 Расчет коэффициентов (количество перехода из состояния в состояние) уравнения.
|ВЫБРАТЬ
| УзлыКорректировки.НомерУзла КАК НомерУзла,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.Стоимость) КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициент,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьБезНДС) КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентБезНДС,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ПостояннаяРазница) КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентПостояннаяРазница,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ВременнаяРазница) КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентВременнаяРазница,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходы) КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходы,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходыБезНДС) КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходыБезНДС,
|
| ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
| / УзлыКорректировки.Количество КАК Стоимость,
| ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
| / УзлыКорректировки.Количество КАК СтоимостьБезНДС,
| ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
| / УзлыКорректировки.Количество КАК ПостояннаяРазница,
| ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ВременнаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
| / УзлыКорректировки.Количество КАК ВременнаяРазница,
| ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходы, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
| / УзлыКорректировки.Количество КАК СтоимостьДопРасходы,
| ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходыБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
| / УзлыКорректировки.Количество КАК СтоимостьДопРасходыБезНДС
|
|ПОМЕСТИТЬ ВременнаяТаблицаРешений
|ИЗ
| ВтУзлыКорректировки КАК УзлыКорректировки
| ЛЕВОЕ СОЕДИНЕНИЕ ВтПеремещенияСписания КАК ПеремещенияСписания
| ПО УзлыКорректировки.НомерУзла = ПеремещенияСписания.НомерУзлаПриемник
| ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ВтТаблицаРешений
| ПО ПеремещенияСписания.НомерУзлаИсточник = ВтТаблицаРешений.НомерУзла
|ГДЕ
| УзлыКорректировки.Количество <> 0
| И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) > -999999999.999999999
| И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) < 999999999.999999999
|
|СГРУППИРОВАТЬ ПО
| УзлыКорректировки.НомерУзла,
| УзлыКорректировки.Количество
|
|ИНДЕКСИРОВАТЬ ПО
| НомерУзла
|;
|/////////////////////////////////////////////////////////////////////////////
// 1 Расчет ошибки расчета.
|ВЫБРАТЬ
| ЕСТЬNULL(
| МАКСИМУМ(
| ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент
| + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))) > 0 ТОГДА
|
| ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент
| + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))
| ИНАЧЕ
| -(
| ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент
| + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))
| )
| КОНЕЦ
| )
| ,0) КАК Отклонение,
| ЕСТЬNULL(
| МАКСИМУМ(
| ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))) > 0 ТОГДА
|
| ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))
| ИНАЧЕ
| -(
| ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))
| )
| КОНЕЦ
| )
| ,0) КАК ОтклонениеБезНДС,
| ЕСТЬNULL(
| МАКСИМУМ(
| ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
| + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))) > 0 ТОГДА
|
| ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
| + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))
| ИНАЧЕ
| -(
| ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
| + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))
| )
| КОНЕЦ
| )
| ,0) КАК ОтклонениеПостояннаяРазница,
| ЕСТЬNULL(
| МАКСИМУМ(
| ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
| + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))) > 0 ТОГДА
|
| ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
| + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))
| ИНАЧЕ
| -(
| ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
| + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))
| )
| КОНЕЦ
| )
| ,0) КАК ОтклонениеВременнаяРазница,
|
| ЕСТЬNULL(
| МАКСИМУМ(
| ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА
|
| ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
|
| ИНАЧЕ
| -(
| ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
| )
| КОНЕЦ
| )
| ,0) КАК ОтклонениеДопрасходы,
| ЕСТЬNULL(
| МАКСИМУМ(
| ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА
|
| ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
|
| ИНАЧЕ
| -(
| ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
| + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))
| )
| КОНЕЦ
| )
| ,0) КАК ОтклонениеДопрасходыБезНДС
|ИЗ
| ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
|
| ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ТаблицаРешений
| ПО ВременнаяТаблицаРешений.НомерУзла = ТаблицаРешений.НомерУзла
|;
|//////////////////////////////////////////////////////////////
// 2 Удаление таблиц.
|УНИЧТОЖИТЬ ВтТаблицаРешений
|;
// 3 Суммирование коэффициентов.
|//////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВременнаяТаблицаРешений.НомерУзла КАК НомерУзла,
| ВЫРАЗИТЬ(
| ВременнаяТаблицаРешений.СвободныйКоэффициент
| + ВременнаяТаблицаРешений.Стоимость
| КАК ЧИСЛО(23,10)) КАК Стоимость,
| ВЫРАЗИТЬ(
| ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС
| + ВременнаяТаблицаРешений.СтоимостьБезНДС
| КАК ЧИСЛО(23,10)) КАК СтоимостьБезНДС,
| ВЫРАЗИТЬ(
| ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница
| + ВременнаяТаблицаРешений.ПостояннаяРазница
| КАК ЧИСЛО(23,10)) КАК ПостояннаяРазница,
| ВЫРАЗИТЬ(
| ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница
| + ВременнаяТаблицаРешений.ВременнаяРазница
| КАК ЧИСЛО(23,10)) КАК ВременнаяРазница,
|
| ВЫРАЗИТЬ(
| ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы
| + ВременнаяТаблицаРешений.СтоимостьДопРасходы
| КАК ЧИСЛО(23,10)) КАК СтоимостьДопРасходы,
| ВЫРАЗИТЬ(
| ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходыБезНДС
| + ВременнаяТаблицаРешений.СтоимостьДопРасходыБезНДС
| КАК ЧИСЛО(23,10)) КАК СтоимостьДопРасходыБезНДС
|
|ПОМЕСТИТЬ ВтТаблицаРешений
|
|ИЗ
| ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
|
|ИНДЕКСИРОВАТЬ ПО
| НомерУзла
|;
|//////////////////////////////////////////////////////////////
// 4 Удаление таблицы.
| УНИЧТОЖИТЬ ВременнаяТаблицаРешений
|»;
фпк1сл
14 — 03.02.16 — 12:58
Запрос выполняется с использованием Менеджера временных таблиц
фпк1сл
15 — 03.02.16 — 13:02
Еще глупый вопрос, в запросе выполняется первый пакет. Как мне его найти?
фпк1сл
16 — 05.02.16 — 09:26
я вычислил, что всему виной вот эта строчка в запросе
| ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))
Здесь и происходит переполнение.
Ёпрст
17 — 05.02.16 — 09:35
(16) выкини выразить оттуда
Ёпрст
18 — 05.02.16 — 09:35
и спи спокойно дальше
фпк1сл
19 — 05.02.16 — 09:42
(17) Не помогло, все та же ошибка преобразования numeric.
Что интересно, только за апрель документ выжучивается, следующий месяц проводится без проблем.
Ёпрст
20 — 05.02.16 — 09:43
ну поставь КАК ЧИСЛО(15,0)
фпк1сл
21 — 05.02.16 — 09:53
(20) Все так же упрямо выскакивает эта ошибка.
НЕА123
22 — 05.02.16 — 10:00
СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0)) Как СуммаПР,
Сумма(ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК СуммаСписания,…
может дикие числа.
НЕА123
23 — 05.02.16 — 10:03
вообще, ИМХО, ВЫРАЗИТЬ в Сумма засунуть.
Tateossian
24 — 05.02.16 — 10:09
(16) Выведи в отладке содержимое ВтТаблицаРешений в ТЗ и посмотри, что там за числа.
фпк1сл
25 — 05.02.16 — 10:53
(23) выразил, снова ошибка. (24) Глазами пробежался по 12к строк, на первый взгляд никакого криминала. Попробую покромсать запрос и выполнять по частям.
фпк1сл
26 — 05.02.16 — 13:11
Получается, что «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» имеют значение Null.
И если подставить, то получается, что выражение
ВЫРАЗИТЬ(СУММА(0 * 0) КАК ЧИСЛО(23,10)) — вызывает арифметическое переполнение.
фпк1сл
27 — 05.02.16 — 13:50
Был неправ, зайдя дальше обнаружил, что умножение «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» на какой то итерации дает переполнение, буду двигаться дальше.
фпк1сл
28 — 09.02.16 — 15:52
При проведении документа «Расчет себестоимости» формируются записи регистра накопления «Себестоимость товаров». Так вот за 2014 год все формировалось нормально, а с 2015 в колонке «Стоимость (ПР)» — постоянная разница, только по 2-3 номенклатурам начали появляться и расти огромные числа. Подскажите, из-за чего растет постоянная разница строго по 2 позициям номенклатуры?
фпк1сл
29 — 10.02.16 — 10:10
Пример. Одна организация, два склада.
Документ перемещения формирует две записи в регистре накопления — Количество(10) по двум складам.
Документ Расчет себестоимости товаров формирует одну запись — Стоимость(ПР) : 134 046 229,30. Откуда такая цифра? Причем некоторые записи идут корректно, в чем разница, так и не понял.
I have a column called [column_us] in my table where I have given the data type as smallmoney not null.
Initially it looked good and data is feeding into this table , but after one month I’m getting an error:
Arithmetic overflow error converting numeric to data type smallmoney.
The statement has been terminated.
Do I need to change the data type to numeric (19,4) notnull to this column? If so, can you please explain which data type I should be using small money, money, or numeric?
Also how many values does the small money allow after decimal point.
TylerH
20.7k65 gold badges73 silver badges98 bronze badges
asked Apr 27, 2017 at 22:13
In general, it is recommended to choose numeric()
with the precision and scale you need. Money
types may produce unexpected results when used with division (much further discussion on money
found on this question: Should you choose the money
or decimal(x,y)
datatypes in SQL Server?).
numeric
:
+-----------+---------------+
| Precision | Storage bytes |
+-----------+---------------+
| 1 - 9 | 5 |
| 10-19 | 9 |
| 20-28 | 13 |
| 29-38 | 17 |
+-----------+---------------+
money
and smallmoney
:
+------------+-------------------------------------------------------+---------+
| Data type | Range | Storage |
+------------+-------------------------------------------------------+---------+
| money | -922,337,203,685,477.5808 to 922,337,203,685,477.5807 | 8 bytes |
| smallmoney | - 214,748.3648 to 214,748.3647 | 4 bytes |
+------------+-------------------------------------------------------+---------+
Reference:
- Should you choose the
money
ordecimal(x,y)
datatypes in SQL Server? - money and smallmoney — docs
- decimal and numeric — docs
answered Apr 27, 2017 at 22:18
SqlZimSqlZim
37.1k6 gold badges41 silver badges59 bronze badges
0
A smallmoney is not able to store big amounts, you should use money type instead.
smallmoney and money type are mostly used for display purpose (currency symbol, …).
numeric or decimal types are more accurate with calculation.
You should consider searching more : I’ve found plenty of in depth explainations.
answered Apr 27, 2017 at 22:35
0
Может довольно простой вопрос.
Но хотелось бы узнать механизм работы.
Почему
SELECT 2000000000 * 3
--Ошибка арифметического переполнения при преобразовании expression к типу данных int.
SELECT 3000000000 * 3
-- 9000000000
Если создать вью
create view ts
as
SELECT 2000000000 * 3 AS A, 3000000000 * 3 AS B
, то в типах данных увидим такое