Арифметическое переполнение в SQL Server с помощью функции Power () - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь создать таблицу, содержащую значения 10^(existing_field_value / 10).Я могу воссоздать проблему с помощью следующей упрощенной таблицы:

Date,       Time,     Timer,   Overall_Spectra, 6_3_Hz, 20_Hz
10/23/2018, 12:24:13, 0:19:59, 69.7,            -17.4,  8.9
10/23/2018, 12:24:14, 0:19:58, 70.8,            -31.1,  4.4
10/23/2018, 12:24:15, 0:19:57, 70.7,            -28.9,  4.8
10/23/2018, 12:24:16, 0:19:56, 69.0,            -27.0,  5.9

Данные были импортированы из плоского текстового файла со следующими типами данных:

Date, date
Time, time(0)
Timer, time(0)
Overall_Spectra, decimal(3,1)
6_3_Hz, decimal(3,1)
20_Hz, decimal(3,1)

Использование оператора T-SQLниже я смог закомментировать 2 из 3 указанных полей одновременно.При этом желаемые результаты возвращаются для полей 6_3_Hz и 20_Hz, но для поля Total_Spectra возвращает SSMS:

select
         POWER(10.000000000000000000000000000000000000,Overall_Spectra/10)
         POWER(10.000000000000000000000000000000000000,"6_3_Hz"/10)
         Power(10.000000000000000000000000000000000000,"20_Hz"/10)
from sound;


Msg 8115, Level 16, State 6, Line 1
Arithmetic overflow error converting float to data type numeric.

Я ссылался на следующую документацию MS в попытке понять, что происходит (в частности,таблица типов возвращаемых данных), но безрезультатно:

https://docs.microsoft.com/en-us/sql/t-sql/functions/power-transact-sql?view=sql-server-2017

Я запутался в вопросе, когда SQL использует тип данных с плавающей запятой, поскольку это, кажется, в некотором родепричина ошибки.Буду очень признателен за понимание того, что делает SQL, или о том, что я делаю безумно! !!

1 Ответ

0 голосов
/ 07 декабря 2018

Значение maximum PRECISION для DECIMAL как минимум в SQL Server 2014 равно 38. Вы используете POWER(10), любое число, которое POWER создает число с более чем 38 цифрами, вызовет переполнение.

Так, например, это: POWER(10.000000000000000000000000000000000000, 19.9 / 10) Будет работать, так как полученный номер имеет <= 38 цифр. Если вы увеличите число до <code>POWER(10.000000000000000000000000000000000000, 20.9 / 10), вы получите число с более чем 38 цифрами, а затем ошибка переполнения

См. Это как ссылку на точность и масштаб:

(https://docs.microsoft.com/en-us/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-2017)

...