以下是我正在使用的表结构和数据类型的子集。
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,则转换将失败