相关疑难解决方法(0)

为什么“SELECT POWER(10.0, 38.0);” 抛出算术溢出错误?

我正在更新我的IDENTITY溢出检查脚本以考虑DECIMALNUMERIC IDENTITYcolumns

作为检查的一部分,我计算每一IDENTITY列的数据类型范围的大小;我用它来计算该范围的百分比已用完。因为DECIMALNUMERIC 该范围的大小2 * 10^p - 2p是精度在哪里。

我用DECIMALNUMERIC IDENTITY列创建了一堆测试表,并尝试按如下方式计算它们的范围:

SELECT POWER(10.0, precision)
FROM sys.columns
WHERE 
       is_identity = 1
   AND type_is_decimal_or_numeric
;
Run Code Online (Sandbox Code Playgroud)

这引发了以下错误:

Msg 8115, Level 16, State 6, Line 1
Arithmetic overflow error converting float to data type numeric. 
Run Code Online (Sandbox Code Playgroud)

我将它缩小到IDENTITY类型的列DECIMAL(38, 0)(即具有最大精度),然后我POWER()直接尝试对该值进行计算。

以下所有查询

SELECT POWER(10.0, 38.0);
SELECT CONVERT(FLOAT, (POWER(10.0, 38.0)));
SELECT CAST(POWER(10.0, 38.0) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server datatypes t-sql type-conversion

16
推荐指数
2
解决办法
1万
查看次数