算术溢出,识别哪些列和行?

时间:2012-03-20 17:21:53

标签: sql view casting overflow decimal

我对大约236列有一个巨大的视图,包含至少500'000行。如果我做一个简单的SELECT * FROM VIEW,我会在某个时刻出现算术溢出,而SELECT会中止。

我确切地知道为什么 - 在某些行和列中,CAST(COL AS DECIMAL(x,y))失败,这是由一个太大而不适合投射所构成限制的数字引起的。我需要确定确切的行和列,并且我希望找到一种自动方法来查找导致此问题的数据。

这有可能以某种方式以自动方式进行吗?作为蛮力方式,有点过于详尽,因为我必须通过相关列(大约80列被转换为十进制),然后找到确切的行,我还没有开发出一种方法。我无法“看到”该行,因为它失败了,因此从未显示过。

该视图位于SQL Server 2008 R2上。

2 个答案:

答案 0 :(得分:2)

我在SO上找到了一些可能有用的答案。

How to figure out which column raises an arithmetic overflow error upon insert?(有一个确定列的脚本)

SELECT  'PRINT ''' 
        + sc.Name 
        + '''; SELECT MIN(CAST(' 
        + sc.Name 
        + ' AS INTEGER)) FROM Usertable'
FROM    sys.columns sc 
        INNER JOIN sys.types st ON st.system_type_id = sc.system_type_id
WHERE   OBJECT_NAME(Object_ID) = 'BaseTable'
        AND st.name = 'INT'

知道列后,您应该可以深入查找该行。关于找到行还有另一个问题:

Find out which row caused the error

或者这个问题:

T-SQL Arithmetic overflow: which column?

答案 1 :(得分:0)

是的,遗憾的是,没有一种很好的自动方式可以找到对于给定演员表无效的值。你几乎无法分裂和征服并编写查询,例如bluefeet引用的查询,以缩小范围。

在该查询中使用DMV的技术将为您节省一些时间。

另外,请注意诸如

之类的陈述
select cast(col as decimal(18,6)
where isnumeric(col)

isnumeric不仅意外地处理某些值,而且sql server可以自由确定应用操作的顺序,因此查询可能会在过滤行之前应用强制转换。即使过滤器位于子查询或CTE内,也会发生这种情况。

最后,请记住,您可以在调查中使用top x percent子句来帮助您缩小导致问题的行。