我对大约236列有一个巨大的视图,包含至少500'000行。如果我做一个简单的SELECT * FROM VIEW
,我会在某个时刻出现算术溢出,而SELECT
会中止。
我确切地知道为什么 - 在某些行和列中,CAST(COL AS DECIMAL(x,y))
失败,这是由一个太大而不适合投射所构成限制的数字引起的。我需要确定确切的行和列,并且我希望找到一种自动方法来查找导致此问题的数据。
这有可能以某种方式以自动方式进行吗?作为蛮力方式,有点过于详尽,因为我必须通过相关列(大约80列被转换为十进制),然后找到确切的行,我还没有开发出一种方法。我无法“看到”该行,因为它失败了,因此从未显示过。
该视图位于SQL Server 2008 R2上。
答案 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
或者这个问题:
答案 1 :(得分:0)
是的,遗憾的是,没有一种很好的自动方式可以找到对于给定演员表无效的值。你几乎无法分裂和征服并编写查询,例如bluefeet引用的查询,以缩小范围。
在该查询中使用DMV的技术将为您节省一些时间。
另外,请注意诸如
之类的陈述select cast(col as decimal(18,6)
where isnumeric(col)
isnumeric
不仅意外地处理某些值,而且sql server可以自由确定应用操作的顺序,因此查询可能会在过滤行之前应用强制转换。即使过滤器位于子查询或CTE内,也会发生这种情况。
最后,请记住,您可以在调查中使用top x percent
子句来帮助您缩小导致问题的行。