【问题标题】:How to identify row in query results that is causing fatal error?如何识别查询结果中导致致命错误的行?
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    从 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-08-27
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2020-11-07
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多