【发布时间】:2012-12-21 01:10:59
【问题描述】:
我的查询运行了一段时间(输出行)然后停止,出错:
消息 8115,级别 16,状态 8,行 5 算术溢出错误 将 int 转换为数据类型 numeric。
这并没有告诉我是哪一行(由 FROM 子句形成的行集 - 不是 SQL 查询中的哪一行)导致了这个错误。
我使用了旧技巧,即转到查询选项并取消选中“set arithabort”和“set ansi_warnings”,这会导致查询继续运行并将 NULL 放入有问题的单元格中。
问题是结果集可以在很多地方正确地有一个 NULL,所以这没有帮助。 (并且错误消息同样含糊不清:“发生算术溢出。”)
我绞尽脑汁想弄清楚这一点 - 我曾考虑过使用游标或循环,但每个都有问题。
当你遇到这样的错误时,你们会怎么做,以便找出是哪一行导致的?
更新:感谢以下有用的建议;他们很棒而且工作得很好。但是,在解决这个问题之前(这个查询中有很多列),我只想查看导致错误的行。幸运的是,我猜到查询结果集中的最后一行是错误发生之前的那一行。当我进行查询以查看该行正下方的数据(当然减去计算字段)时,我立即注意到其中一个 INT 字段中的值大于正常值。
这似乎是在编写如下查询的麻烦之前迈出的一个很好的第一步 - 但是谢谢,我会保存这些,并且稍后在查看违规数据时问题不那么明显时肯定会需要它们。
【问题讨论】:
-
或许您可以在问题中添加查询。
-
它非常庞大——从逻辑上通过它来发现错误似乎很痛苦——似乎应该有一种方法可以快速找到有问题的行。
-
您是指查询中的行(如
Line 5)还是表中的行? -
对不起,我应该清楚的。我的意思是表中的行(或者更确切地说我猜是通过连接几个表形成的行集)
-
查看查询真的很有帮助,但作为建议,我会看看查询中的任何地方是否将
int值选择为numeric值,然后查看numeric的精度和规模。例如,尝试将值 10 设置为numeric(3,2)变量,您将收到此错误。此外,可能有多行错误。
标签: sql sql-server tsql