当前位置: 首页 > 面试题库 >

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

颜高朗
2023-03-14
问题内容

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

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)上溢出。

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

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



 类似资料:
  • 问题内容: 我正在设计SQL Server 2008 R2 SP2 Express数据库中的表。我创建的表具有用于数据的列和用于自动递增标识的列,并假设行数不多(这就是为什么我选择0-255 )。当我添加超过255行时,即使删除该表中的所有行并尝试添加一个新行,该错误仍然会永久发生。我正在使用SQL Server Management Studio Express进行此操作。 如何强制数据库引擎检

  • 问题内容: 此选择语句为我提供了算术错误消息: 尽管这一方法有效: 数据可能出问题了(我已经检查了空值,但没有一个)? 问题答案: 发现问题出在日期设置为9999-12-31时,可能要处理大数以十进制表示。从十进制更改为浮点,并且所有事物都像魅力一样起作用。

  • 问题内容: 我有以下查询: 无论我注释掉什么条件或聚合,总是会出现以下错误:。 我可以从这里去哪里?如何进一步调试? 编辑:样本数据 问题答案: 您是否尝试过将jaguarstartup时间强制转换为avg聚合中的bigint,如下所示… AVG(CAST(mc.JaguarStartupTime AS BIGINT)) 这应该解决算术溢出。 要计算平均平均值,服务器需要首先能够对所有int求和,

  • 问题内容: 我正在尝试使用存储过程基于varchar类型的“名称”列的输入值来返回“项目”表的“ ItemId”列值,但是每当我将任何值传递给存储过程时,它都会向我返回错误: 将数据类型varchar转换为int时出错。 这就是我所说的: 问题答案: 您必须匹配参数:RETURN不会填充OUTPUT参数:您对@itemid的赋值可以做到这一点。 另外,您存储的过程太复杂了。对于从存储的proc返回

  • 问题内容: 在SO上进行了搜索和搜索,无法弄清楚 尝试将每个字段作为FLOAT进行铸造都无济于事,转换没有给我任何进一步的帮助。 如何获取以下case子句以返回THEN部分中所述的值? 错误:消息8114,级别16,状态5,行1将数据类型varchar转换为float时出错。 我的SQL查询的错误部分: average_days_pay = float terms_code = char 问题答案

  • 问题内容: 数据输入: 存储过程的相关部分: 错误:将varchar数据类型转换为datetime数据类型导致值超出范围。 这是CONVERT(DATETIME)的唯一调用,并且我不使用CAST 如果我只是直接传递数据,则会插入该行。如果我运行该存储过程,它将超出范围。 问题答案: 在SQL Server中使用的安全日期时间字符串格式为 或。 如果SET DATEFORMAT为dmy,则转换将失败