SQL: Msg 2570, value is out of range

Ежедневная задача проверки и архивирования баз закончилась с ошибкой. Просмотр логов показал, что у одной базы нарушена целостность. Запустил проверку этой базы вручную:

DBCC CHECKDB('DB4') WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY

Результат следующий:

Msg 2570, Level 16, State 3, Line 1
Page (1:667076), slot 0 in object ID 1932559410, index ID 1, partition ID 72057857351876608, alloc unit ID 72057857125515264 (type "In-row data"). Column "_Fld5071" value is out of range for data type "numeric".  Update column to a legal value.
CHECKDB found 0 allocation errors and 1 consistency errors in table '_Document197_VT5051' (object ID 1932559410).
CHECKDB found 0 allocation errors and 1 consistency errors in database 'DB4'.

Значение столбца _Fld5071 в одной из строк "улетело" за границы диапазона. Статья MS https://support.microsoft.com/en-us/kb/923247 говорит о том, что ошибку 2570 нельзя исправить автоматическими средствами исправления. Все 122 000 строк таблицы имеют значение ноль в данном столбце, за исключением одной - это сильно упрощает. Тут есть небольшая хитрость, поскольку значение вне диапазона, то не надо его пытаться вывести в явном виде, будет ошибка переполнения. Сначала проверяем, что такая строка действительно одна:

SELECT COUNT(*)
FROM [DB4].[dbo].[_Document197_VT5051]
WHERE [_Fld5071] <> 0

1

Затем обновляем значение:

UPDATE [DB4].[dbo].[_Document197_VT5051]
  SET [_Fld5071] = 0
  WHERE [_Fld5071] <> 0

(1 row(s) affected)

И еще раз проверку:

DBCC CHECKDB('DB4') WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY

Command(s) completed successfully.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *