1

私のクエリはしばらく実行され(行を出力)、その後停止し、次のエラーが発生します。

メッセージ 8115、レベル 16、状態 8、行 5 int を数値データ型に変換中に算術オーバーフロー エラーが発生しました。

それは、どの行 (FROM 句によって形成された行セットの - SQL クエリのどの行ではない) がこのエラーを引き起こしているかを教えてくれません。

クエリ オプションに移動し、「set arithabort」と「set ansi_warnings」のチェックを外すという古いトリックを使用しました。これにより、クエリが実行され続け、問題のセルに NULL が入力されます。

問題は、結果セットが多くの場所で正しく NULL を持つ可能性があるため、これは役に立たないことです。(また、エラー メッセージも同様にあいまいです:「算術オーバーフローが発生しました。」)

私はこれを理解しようと頭を悩ませています.カーソルまたはループを使用することを考えましたが、それぞれに問題があります.

このようなエラーが発生した場合、どの行が原因であるかを調べるために、皆さんはどうしますか?

更新: 以下の有益な提案に感謝します。彼らは素晴らしく、うまく機能します。ただし、その問題に取り組む前に (このクエリには多くの列があります)、エラーの原因となっている行を確認したかっただけです。幸いなことに、クエリ結果セットの最後の行は、エラーが発生する直前の行であると推測しました。その行のすぐ下のデータ (もちろん計算フィールドを除く) を表示するためにクエリを生で行ったところ、すぐに INT フィールドの 1 つに通常より大きい値があることに気付きました。

これは、以下のようなクエリを作成する前の適切な最初のステップのように思えますが、ありがとうございます。問題のあるデータを見て問題が明らかでない場合は、それらを保存しておきます。

4

2 に答える 2

1

私たちは本当にあなたのSQLを見る必要があります。UNIONを使用していますか?通常、最初の行がデータ型を決定します。別のテーブルに挿入していますか?(私が以下で仮定したように?)

SELECT部分​​をINT型の各列をMAXに変更し、このテストの他のすべての列を削除します。答えはおそらく明白でしょう。

SELECT MAX(myFirstIntColumn) myFirstIntColumn,
MAX(mySecondIntColumn)
...
FROM same

答えが明らかでない場合は、挿入しようとしている列を見てください。少なくとも1つの最大値がターゲットの1つに適合しません。これは、挿入しようとしているデータ型で取得した各最大値をテストすることで確認できます。何かのようなもの:

 SELECT CAST(1122399 AS DECIMAL(7,2))
于 2012-12-21T02:06:24.813 に答える
0

メッセージ8115、レベル16、状態8、5行目intをデータ型数値に変換する算術オーバーフローエラー。

整数から数値まで、私が考えることができる唯一のエラーは、小数点以下の桁数のプロビジョニングされた桁数のオーバーフローに起因します。

select cast(123456 as numeric(7,2))

(7,2)は、小数点以下2桁、前5桁の合計7桁を意味します。

このようなレコードの場合、次のタイプのクエリを使用して違反者を見つけることができます。

select ...
  from (... table(s) ...)
 where len(left(replace(cast(col1 as varchar),'.',space(100)),100)) > 5
   and col1 like '%.%'

これにより、数値(小数点以下)の列、および小数点の左側に5桁を超える桁がある列がフラッシュされます。

于 2012-12-21T01:58:47.350 に答える