Арифметическое переполнение - обработка переполненных дел - PullRequest
0 голосов
/ 27 апреля 2018

Мне не удалось исправить этот случай даже после просмотра многих потоков.

У меня есть столбец десятичной дроби (8,4) и таблица данных, содержащая 4 случая, которые являются линией пути и превышают верхний предел. Все в порядке. У меня есть скрипт импорта, где производительность не имеет значения, он будет использоваться максимум ~ 20 раз.

Я пытался решить проблему многими способами, например (этот код является частью инструкции SELECT):

CASE WHEN PRT.InputColumn > 999 THEN 999.9999 ELSE PRT.InputColumn END as MyColumn

Но, по-видимому, сервер вычисляет десятичное число (8,4) при оценке оператора WHEN и в любом случае выдает ошибку. Хорошо, я думал, что это может решить проблему:

CASE WHEN TRY_CONVERT(decimal(12,4), PRT.InputColumn) IS NULL THEN 999.9999 ELSE PRT.InputColumn END as MyColumn

Но все равно я получаю ту же ошибку:

Arithmetic overflow error converting numeric to data type numeric.

Так что я хочу сохранить тип данных columnd как есть и обрабатывать чрезмерные значения. Как правильно обработать переполненные значения ?

1 Ответ

0 голосов
/ 27 апреля 2018

Когда вы TRY_CONVERT в DECIMAL (12,4), вы можете получить значения больше, чем 9999, конечно, они не вписываются в DECIMAL (8,4).

Просто переключитесь на 8,4 вместо:

CASE WHEN TRY_CONVERT(decimal(8,4), PRT.InputColumn) IS NULL 
     THEN 9999.9999 
     ELSE PRT.InputColumn
END as MyColumn

или короче:

COALESCE(TRY_CONVERT(decimal(8,4), PRT.InputColumn), 9999.9999)

Внимание, оба преобразуют большие отрицательные значения в 9999.9999 тоже.

...