CAST/CONVERT 问题 算术溢出错误
Posted
技术标签:
【中文标题】CAST/CONVERT 问题 算术溢出错误【英文标题】:CAST/CONVERT problem Arithmetic overflow error 【发布时间】:2019-08-30 01:01:53 【问题描述】:SELECT
有效,但 UPDATE
无效。
CAST
和 CONVERT
的每个版本
我收到此错误:
将 int 转换为数据类型 numeric 的算术溢出错误
当我尝试这样做时:
$sql = "UPDATE rentinc ".
"SET curr_loss_mo = ROUND(CONVERT(numeric(3,0), DATEDIFF(DAY, missincdate, GETDATE()) / 30), 0) ".
"WHERE months2 > 12";
我很确定上面的代码有些矫枉过正,但我正在尝试一切。
我可以转到 SSMS 并运行此 SELECT:
SELECT curr_loss_mo, ROUND(CONVERT(numeric(3, 0), DATEDIFF(DAY, missincdate, GETDATE()) / 30), 0) AS DateNumCalc
FROM rentinc
WHERE months2 > 12
而且效果很好。而且这两列看起来一模一样! curr_loss_mo
字段是 numeric(3,0)
,表中没有任何值会尝试使用超过三个字符进行更新。
那么为什么会出现这个错误?
“将 int 转换为数据类型 numeric 的算术溢出错误”
【问题讨论】:
我不太明白这两个查询之间有什么关系。它们具有不同的过滤条件,因此它们不会处理同一组行。 您对两个查询有不同的WHERE
条件。尝试在MMS
中使用相同的条件,这可能是curr_loss_mo IS NULL
导致您的问题的情况
这是 SQL Server 查询吗?如果是这样,请标记为这样
对于 1937 年 7 月 12 日至 2101 年 10 月 19 日之间的所有 missincdate
值,表达式应适合 numeric(3,0)
(大致截至今天)。因为错误表明来自 @ 的转换987654334@ 是导致问题的原因,我认为它一定是由round()
函数引起的。您的日期值的列类型是什么?正如已经指出的那样,过滤器是不一样的。您是否有任何空白或零被视为 1900 年 1 月 1 日?
rentinc
和 temp_rentinc
是不同的表。它们是否具有相同的架构?
【参考方案1】:
事实证明,这个谜团变得更深了,但我找到了解决方法,所以我处理了它。
我制作了名为 temp_rentinc 的rentinc 表的临时副本。这是一个 EXACT COPY,如“SELECT * INTO temp_rentinc FROMrentinc”。
出于令我完全困惑的原因,我在上面发布的更新代码适用于 temp_rentinc,但不适用于rentinc!莫名其妙,我写了一个程序,通过“SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '每个表名'来比较结构。”
程序验证它们完全一样。叹。有时,小精灵会抓住你。长话短说,我杀死了原始表,并反转 SELECT INTO 以重新创建表,代码现在可以正常工作了。
这在“WTF”中?文件。谢谢各位的意见。 ——约翰
【讨论】:
以上是关于CAST/CONVERT 问题 算术溢出错误的主要内容,如果未能解决你的问题,请参考以下文章
Azure ADF 错误算术溢出错误将表达式转换为数据类型 int
将 varchar 转换为数字数据类型时出现算术溢出错误。找不到存储过程''。?