如果Varchar超过999,则算术溢出错误,为什么?
我在我的数据库中发现了一个奇怪的问题,我能够修复它,但我不明白为什么首先会发生错误。我正在使用 Microsoft SQL Server 2017。
以下代码返回算术溢出错误:
SELECT '1000' / 100.0 FROM table_name
SELECT '1000.0' / 100.0 FROM table_name
返回错误:
将 varchar 转换为数字类型的算术溢出错误。
但奇怪的是以下代码不会导致错误:
SELECT '100' / 100.0 FROM table_name
返回:每行 1.000000。
SELECT '999' / 100.0 FROM table_name
返回:每行 9.990000。
SELECT '100.0' / 100.0 FROM table_name
返回:每行 1.000000。
SELECT '1000' / 100 FROM table_name
返回:每行 10 个。
我已经修复了代码,以便它在尝试进行算术运算之前使用转换,但让我困扰的是为什么代码在没有转换小于 1000 的数字的情况下工作????这真是烦死我了!
回答
您在这里有 2 个值:
'1000'这是一个varchar(4)100.0这是一个decimal(4,1)
因此,当您执行表达式时'1000' / 100.0,varchar 将隐式转换decimal为decimal具有更高数据类型优先级的as 。但是,由于 adecimal(4,1)可以存储999.9的最大值是,因此该值会1000溢出并出现错误。