我正在尝试生成一个包含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正在做什么或我正在做什么头脑的洞见都将不胜感激!
答案 0 :(得分:1)
至少在maximum PRECISION
中DECIMAL
上的SQL Server 2014
是38。您正在使用POWER(10)
,任何POWER
产生的数字都更大的数字超过38位将导致溢出。
因此,例如:POWER(10.000000000000000000000000000000000000, 19.9 / 10)
因为产生的数字小于等于38位,所以可以使用
如果将数字增加到POWER(10.000000000000000000000000000000000000, 20.9 / 10)
,则会得到一个超过38位数字的数字,然后出现溢出错误
请参阅此作为“精度和刻度”的参考: