1

我的查询运行了一段时间(输出行)然后停止,出错:

消息 8115,级别 16,状态 8,第 5 行将 int 转换为数据类型 numeric 的算术溢出错误。

这并没有告诉我哪一行(由 FROM 子句形成的行集 - 不是 SQL 查询中的哪一行)导致了这个错误。

我使用了旧技巧去查询选项并取消选中“set arithabort”和“set ansi_warnings”,这会导致查询继续运行并在有问题的单元格中放置一个 NULL。

问题是结果集可以在很多地方正确地有一个 NULL,所以这没有帮助。(并且错误消息同样含糊不清:“发生算术溢出。”)

我绞尽脑汁想弄清楚这一点——我曾想过使用游标或循环,但每个都有问题。

当你遇到这样的错误时,你们会怎么做,以便找出是哪一行导致的?

更新:感谢以下有用的建议;他们很棒而且工作得很好。但是,在解决这个问题之前(这个查询中有很多列),我只想查看导致错误的行。幸运的是,我猜到查询结果集中的最后一行是错误发生之前的那一行。当我进行查询以查看该行正下方的数据(当然减去计算字段)时,我立即注意到其中一个 INT 字段中的值大于正常值。

这似乎是在编写如下查询的麻烦之前的一个很好的第一步 - 但是谢谢,我会保存这些,并且稍后在查看有问题的数据时问题不是那么明显时肯定会需要它们。

4

2 回答 2

1

我们真的需要看看你的 SQL。你在使用 UNION 吗?第一行通常确定数据类型。你要插入另一个表吗?(就像我在下面假设的那样?)

将 SELECT 部分更改为 MAX 每个 INT 类型的列,删除此测试的所有其他列。答案可能很明显。

SELECT MAX(myFirstIntColumn) myFirstIntColumn,
MAX(mySecondIntColumn)
...
FROM same

如果答案不明显,请查看您尝试插入的列,至少其中一个最大值不适合其中一个目标。您可以通过使用您尝试插入的数据类型测试获得的每个最大值来确认这一点。就像是:

 SELECT CAST(1122399 AS DECIMAL(7,2))
于 2012-12-21T02:06:24.813 回答
0

消息 8115,级别 16,状态 8,第 5 行将 int 转换为数据类型 numeric 的算术溢出错误。

从整数到数字,我能想到的唯一错误来自小数位前预置位数的溢出,例如

select cast(123456 as numeric(7,2))

(7,2) 共 7 位,小数点后 2 位,小数位前 5 位。

对于这样的记录,您可以使用以下类型的查询来查找罪犯:

select ...
  from (... table(s) ...)
 where len(left(replace(cast(col1 as varchar),'.',space(100)),100)) > 5
   and col1 like '%.%'

这将清除数字(有小数)位的列,以及小数位左侧超过 5 位的列。

于 2012-12-21T01:58:47.350 回答