使用Power()函数的SQL Server算术溢出

时间:2018-12-07 19:08:47

标签: sql-server ssms sqldatatypes

我正在尝试生成一个包含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语句,我能够一次注释掉3个引用字段中的2个。这样做,将为6_3_Hz和20_Hz字段返回所需的结果,但对于SSMS的Total_Spectra字段则返回:

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采用float数据类型的观点感到困惑,因为这在某种程度上似乎是导致错误的原因。任何对SQL正在做什么或我正在做什么头脑的洞见都将不胜感激!

1 个答案:

答案 0 :(得分:1)

至少在maximum PRECISIONDECIMAL上的SQL Server 2014是38。您正在使用POWER(10),任何POWER产生的数字都更大的数字超过38位将导致溢出。

因此,例如:POWER(10.000000000000000000000000000000000000, 19.9 / 10) 因为产生的数字小于等于38位,所以可以使用 如果将数字增加到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