2012-03-20 31 views
1

我有一个236列,包含至少500'000行hummuous的看法。如果我做了一个简单的SELECT * FROM VIEW,我会在某个点发生算术溢出,并且SELECT会中止。算术溢出,确定哪些列和行?

我确切地知道为什么 - 在某些行和列中,CAST(COL AS DECIMAL(x,y))失败,这是由于数字太大而无法适应铸造造成的限制。我需要确定确切的行和列,我正在寻找一种自动的方式来查找导致此问题的数据。

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

该视图位于SQL Server 2008 R2上。

回答

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' 

一旦你知道列,你应该能够向下钻取找到该行。也有关于发现该行的另一个SO问题:

Find out which row caused the error

还是这个问题:

T-SQL Arithmetic overflow: which column?

0

呀,可惜的是没有发现是无效的价值的好自动化的方式对于一个给定的演员。你几乎坚持分而治之,并且写了一些查询,比如bluefeet引用的查询来缩小查询范围。

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

此外,提防语句如

select cast(col as decimal(18,6) 
where isnumeric(col) 

不仅isnumeric处理某些值意外,但SQL Server可以自由地确定为了应用的操作,因此该查询可能最终将投在过滤行之前。即使过滤器位于子查询或CTE中,也会发生这种情况。

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