SQL Server Money类型求和溢出但直接赋值正常的原因咨询
SQL Server Money类型求和溢出但直接赋值正常的原因
1. Money类型的取值边界
SQL Server的money类型有明确的存储范围:-922,337,203,685,477.5808 至 922,337,203,685,477.5807。你得到的最终求和结果137721256088510.00确实在这个区间内,所以直接赋值给money变量时不会报错。
2. 求和过程中的中间溢出
Script 1执行求和时,报错的根源在累加的中间步骤:
- 先计算所有正数的总和:
522155575758567.00 + 395662864132351.00 + 187076841800608.00 = 1104895281691526.00 - 这个中间值已经超过了
money类型的最大值(约9.2×10¹⁴)。SQL Server在求和时会用money类型存储临时累加结果,当中间值超出范围时,直接触发Msg 8115算术溢出错误,哪怕最终总和是合法的。
3. 直接赋值与求和的本质差异
- Script 2是直接将合法范围内的数值赋值给
money变量,只需要做一次范围校验,自然通过。 - 求和操作是多步累加的过程,每一步的临时结果都要符合
money的范围约束,中间溢出就会直接终止并报错。
内容的提问来源于stack exchange,提问作者Ivan Budiutama
相关产品推荐
相关产品推荐

