以下查询引发错误:
SELECT POWER( 10, 13)
错误讯息:
Msg 232, Level 16, State 3, Line 1
Arithmetic overflow error for type int, value = 10000000000.000000.
我可以做什么来阻止int溢出?
答案 0 :(得分:3)
添加小数位:
SELECT POWER( 10.0, 11 - LEN(9)) - 1
这导致从int到DECIMAL(18,6)
的隐式转换。你可以把它写成相同的结果:
SELECT POWER(CAST(10 as DECIMAL(18,6)), 11 - LEN(9)) - 1
POWER
函数返回类型记录为:
返回与float_expression中提交的类型相同的类型。例如, 如果将十进制(2,0)作为float_expression提交,则为结果 返回的是十进制(2,0)
这意味着您的结果是DECIMAL(18,6)
,在您的情况下,该结果足以保留最终结果。
答案 1 :(得分:2)
使用以下
SELECT POWER( 10.0, 11 - LEN(9)) - 1
<强>解释强>
当计算产生的结果超出min&amp;时,会发生算术溢出。数据类型可以存储的最大值。在您的情况下,POWER( 10, 11 - LEN(9))
生成10000000000,并且数据类型隐式实现为int。该值大于int
可以采用的最大值,即2147483647,从而产生溢出。如果将POWER( 10.0, 11 - LEN(9))
与10.0一起使用,则计算将生成十进制,因为十进制在SQL Server中的优先级高于int。十进制的范围为- 10^38 +1 through 10^38 - 1
,因此不会为您的计算创建溢出。
答案 2 :(得分:1)
您可以使用CONVERT
:
SELECT CONVERT(DECIMAL(18,2), 10)
这指定2个小数位,但您可以修改括号(18,5)
中的数字以根据需要调整此precision & scale