以下是我正在使用的表结构和数据类型的子集。
CREATE TABLE #Test ( Val varchar(5) ,Type varchar(5) ) INSERT #Test VALUES ('Yes','Text') INSERT #Test VALUES ('10','Int') INSERT #Test VALUES ('10.00','Float') INSERT #Test VALUES ('9.00','Float') INSERT #Test VALUES ('9','Int')
我想编写一个查询,让我知道“ Val”列是否小于等于9.00(必须为数字数据类型)。我通过执行以下操作来做到这一点:
SELECT * FROM ( SELECT Val FROM #Test WHERE Type = 'Int' ) IntsOnly WHERE IntsOnly.Val <= 9.00
这给了我一个算术溢出错误。但是,如果我排除值“ 10”的数据行:
SELECT * FROM ( SELECT Val FROM #Test WHERE Type = 'Int' AND Val <> '10' ) IntsOnly WHERE IntsOnly.Val <= 9.00
它的工作没有任何问题。 我的问题不是如何解决此问题,因为我知道我可以简单地将数据转换为所需的格式。
我的问题是,为什么“ Val”列中的“ 10”值返回错误。当然,逻辑应该只返回’False’并简单地排除行,因为‘10’(我假设是隐式转换的)大于9.00。
谢谢。
这会产生算术溢出,因为它试图将Val列隐式转换为NUMERIC(3,2),该自然会在2位数的值(如10)上溢出。
Val
它使用NUMERIC(3,2)作为目标类型和大小,因为这是9.00似乎适合的最小数字。
9.00
解决方案当然是使用显式CASTing而不是隐式进行