Я столкнулся с арифметическим переполнением в простом операторе SELECT. Запрос был как ниже, например
SELECT [SaleValue] FROM Sales
[SaleValue]
был тип данных, decimal(9,0)
а не вычисляемый столбец.
Причина этого состояла в том, что столбец каким-то образом имел строку, в которой в этом поле хранилось значение БОЛЬШЕ, чем указанный тип данных, например decimal(10,0)
.
Я мог заставить выбор работать, только когда увеличил размер столбца. У рассматриваемой таблицы есть два других экземпляра в двух других столбцах и строках.
Как это было возможно? Как изначально было сохранено значение вне диапазона в столбце?
Я использую сервер Microsoft SQL + это базовая таблица, а не представление.
decimal
- adecimal(9,0)
должен занимать 5 байт,decimal(10,0)
9. Поэтому я думаю, что менее вероятно, что вы могли бы сделать это путем редактирования системных таблиц, поскольку у вас не будет правильный размер хранилища для данных в каждой строке.Ответы:
Это может происходить несколькими способами, например, как описано в разделе Устранение ошибок DBCC 2570 в SQL Server 2005 и более поздних версиях :
Эта статья содержит много полезной информации по теме. Для ознакомления с основными сведениями см. Документацию
DBCC CHECKDB
иDATA_PURITY
конкретный вариант.источник