小编典典

将varchar转换为数值类型的算术溢出错误。'10'<= 9.00

sql

以下是我正在使用的表结构和数据类型的子集。

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。

谢谢。


阅读 325

收藏
2021-03-23

共1个答案

小编典典

这会产生算术溢出,因为它试图将Val列隐式转换为NUMERIC(3,2),该自然会在2位数的值(如10)上溢出。

它使用NUMERIC(3,2)作为目标类型和大小,因为这是9.00似乎适合的最小数字。

解决方案当然是使用显式CASTing而不是隐式进行

2021-03-23