如何识别导致致命错误的查询结果中的行?

时间:2012-12-21 01:10:59

标签: sql sql-server tsql

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

  

Msg 8115,Level 16,State 8,Line 5算术溢出错误   将int转换为数据类型numeric。

那不告诉我WHICH行(由FROM子句形成的行集 - 不是SQL查询中的哪一行)导致此错误。

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

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

我正试图弄明白这一点 - 我曾想过使用游标或循环,但每个都有问题。

当你收到这样的错误时,你们做了什么,以找出导致它的行?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

 SELECT CAST(1122399 AS DECIMAL(7,2))

答案 1 :(得分:0)

  

Msg 8115,Level 16,State 8,Line 5算术溢出错误将int转换为数据类型numeric。

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

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位数的列。