SELECT查询上的算术溢出


9

我在一个简单的SELECT语句中遇到了算术溢出。查询如下

SELECT [SaleValue] FROM Sales

[SaleValue]是数据类型,decimal(9,0)而不是计算列。

发生这种情况的原因是,由于某种原因,该列在该字段存储的行大于指定的数据类型(例如)decimal(10,0)

当我增加列的大小时,我只能使选择工作。所讨论的表在其他两个列和行中还有两个其他实例。

这种情况怎么可能?首先,如何将超出范围的值保存在列中?

我正在使用Microsoft SQL Server,这是一个基表,而不是视图。


1
我认为可能迫使这种情况发生的唯一可能方法是通过DAC编辑系统表-这是一个相当暴力的过程,希望有人能够告诉您是否已对该数据库进行了处理。即使那样,我也不确定它是否会很好地解决(甚至可能)。除此之外,我们确实需要一个repro脚本来亲自了解这种情况,我怀疑如果可能的话,创建repro可能会很容易地花费数年的时间。
Damien_The_Unbeliever

更糟的是,只是想起9/10是的存储大小割接点decimal-一个decimal(9,0)应占据5个字节,一个decimal(10,0)9所以我认为这是不太可能,你可以通过编辑系统表,因为你不会有这样做每行中数据的正确存储大小。
Damien_The_Unbeliever

1
@Damien_The_Unbeliever不知道如何复制。我花了一个小时才弄清楚发生了什么。看到它就像看到干水或冷热。老实说,这让我很困惑。

Answers:


15

这可以通过多种方式发生,例如,如对SQL Server 2005和更高版本中的DBCC错误2570进行故障排除中所述:

出于以下原因,早期版本中的SQL Server数据库中可能存储了无效或超出范围的数据:

  • 使用批量插入方法(例如bcp实用程序)时,源中存在无效数据。
  • 无效数据是通过对SQL Server进行的RPC事件调用传递的。
  • 物理数据损坏的其他可能原因使列值保持无效状态。

该文章包含有关该主题的许多有用信息。有关基础知识,请参阅的文档DBCC CHECKDB以及DATA_PURITY特别的选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.