Арифметическое переполнение при запросе SELECT

9

Я столкнулся с арифметическим переполнением в простом операторе SELECT. Запрос был как ниже, например

SELECT [SaleValue] FROM Sales

[SaleValue]был тип данных, decimal(9,0)а не вычисляемый столбец.

Причина этого состояла в том, что столбец каким-то образом имел строку, в которой в этом поле хранилось значение БОЛЬШЕ, чем указанный тип данных, например decimal(10,0).

Я мог заставить выбор работать, только когда увеличил размер столбца. У рассматриваемой таблицы есть два других экземпляра в двух других столбцах и строках.

Как это было возможно? Как изначально было сохранено значение вне диапазона в столбце?

Я использую сервер Microsoft SQL + это базовая таблица, а не представление.


источник
1
Единственный возможный способ, который я могу придумать, возможно, заставить это произойти, - это редактировать системные таблицы через ЦАП - довольно жестокий процесс, который, как мы надеемся, кто-то мог бы сказать вам, если это было сделано с этой БД. Даже тогда я не уверен, что это сработает вообще (или даже будет возможно). Кроме того, нам действительно нужен сценарий репро, чтобы увидеть эту ситуацию для себя, и я подозреваю, что создание репро, если возможно, может легко занять годы экспериментов.
Damien_The_Unbeliever
Еще хуже, только что вспомнил, что 9/10 - это точка переключения для размера хранилища decimal- a decimal(9,0)должен занимать 5 байт, decimal(10,0)9. Поэтому я думаю, что менее вероятно, что вы могли бы сделать это путем редактирования системных таблиц, поскольку у вас не будет правильный размер хранилища для данных в каждой строке.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever Понятия не имею, как воспроизвести. Мне потребовался час, чтобы понять, что случилось. Видеть это все равно, что видеть сухую воду или холодную жару. Честно говоря, это оставило меня в тупике.

Ответы:

15

Это может происходить несколькими способами, например, как описано в разделе Устранение ошибок DBCC 2570 в SQL Server 2005 и более поздних версиях :

В предыдущих версиях базы данных SQL Server могли храниться недопустимые данные или данные, выходящие за пределы допустимого диапазона, по следующим причинам:

  • Неверные данные присутствовали в источнике при использовании методов массовой вставки, таких как утилита bcp.
  • Неверные данные были переданы через вызовы событий RPC, сделанные на SQL Server.
  • Другие потенциальные причины физического повреждения данных оставили значение столбца в недопустимом состоянии.

Эта статья содержит много полезной информации по теме. Для ознакомления с основными сведениями см. Документацию DBCC CHECKDBи DATA_PURITYконкретный вариант.

Пол Уайт 9
источник