2012-03-20 10 views
1

私は、少なくとも500,000行を含む236の列の巨大なビューを持っています。私が単純なSELECT * FROM VIEWを実行すると、ある時点で算術オーバーフローが発生し、SELECTが異常終了します。算術オーバーフロー、どの列と行を識別しますか?

私は正確に何かの行と列で、キャストによって引き起こされた制限に適合するには大きすぎる数字によって引き起こされるCAST(COL AS DECIMAL(x,y))が失敗することを知っています。正確な行と列を特定する必要があります。この原因となるデータを自動的に見つける方法を探しています。

これは何らかの自動化された方法で何とかすることは可能ですか?私が関連する列(約80列が小数にキャストされている)を通過し、その後、私がまだ方法を開発していない正確な行を見つける必要があるので、ブルートフォースの方法として、あまりにも網羅的です。私はそれが失敗するので、行を「見る」ことができないので、表示されません。

ビューはSQL Server 2008 R2にあります。

答えて

2

私は役に立つと思われるいくつかの答えを見つけました。

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?

0

うん、残念ながら無効な値を見つけるための良い自動化された方法が存在しない行を見つけることに関する別のSOの質問もあります与えられたキャストのために。あなたはかなり細分化して、それを絞り込むためにbluefeetによって参照されるようなクエリを征服し、書くことに悩まされています。

DMVをそのクエリのように使用すると、時間を節約できます。また

、このよう

select cast(col as decimal(18,6) 
where isnumeric(col) 
そのクエリがキャストを適用することになるかもしれないので、

isnumericが予期せず一定の値を処理するだけでなく、しかし、SQL Serverが操作を適用する順序を決定して自由であるなどのステートメントの用心行をフィルタリングする前にこれは、フィルタがサブクエリまたはCTEの内部にある場合にも発生します。

最後に、調査にtop x percent句を使用すると、問題の原因となる行を絞り込むことができます。

関連する問題