質問

これは、簡単な例の形で尋ねるのが一番だと思います。次のSQLのチャンクにより、" DB-Library Error:20049 Severity:4 Message:Data-conversion results by overflow" メッセージが表示されますが、どうしてですか?

declare @a numeric(18,6), @b numeric(18,6), @c numeric(18,6)
select @a = 1.000000, @b = 1.000000, @c = 1.000000
select @a/(@b/@c)
go 

これはどのように違いますか:

select 1.000000/(1.000000/1.000000)
go

どちらが問題なく動作しますか?

役に立ちましたか?

解決

Sybaseを最後に使用しようとしたときに同じ問題に遭遇しました(数年前)。 SQL Serverの考え方からすると、Sybaseが小数点を強制的に変更しようとすることを理解していませんでした。 :)

Sybaseマニュアル

  

次の場合に算術オーバーフローエラーが発生します。   新しいタイプの小数点が少なすぎます   結果を収容する場所。

さらに下へ:

  

暗黙的な数値への変換中   または小数型、スケールの損失   スケールエラーを生成します。使用   arithabort numeric_truncationオプション   そのようなエラーがどれほど深刻かを判断する   考えられている。デフォルト設定   arithabort numeric_truncation on、   原因となるステートメントを中止します   エラーですが、他の処理を続行します   トランザクション内のステートメントまたは   バッチ。 arithabortを設定した場合   numeric_truncation off、適応   サーバーはクエリ結果を切り捨て、   処理を続行します。

したがって、精度の低下がシナリオで許容されると仮定すると、おそらくトランザクションの開始時に次のものが必要になります。

SET ARITHABORT NUMERIC_TRUNCATION OFF

そして、トランザクションの最後に:

SET ARITHABORT NUMERIC_TRUNCATION ON

これは何年も前に私にとってそれを解決したものです...

他のヒント

これは単なる推測に過ぎませんが、DBMSは変数の動的な値ではなく、潜在的な値のみを見ている可能性がありますか?したがって、6桁の数値を6桁の数値で割ると、12桁の数値になる可能性があります。文字通りの分割では、DBMSはオーバーフローがないことを認識します。ただし、DBMSが気にする理由はまだわかりません。2つの6進数の除算の結果を最大18桁の数値として返す必要はありませんか。

最初の例で変数を宣言したので、結果は同じ宣言(つまり数値(18,6))であると予想されますが、そうではありません。

1つ目はSQL2005で機能しました(1.000000 [同じ宣言型]を返しました)が、2つ目は戻りました(1.00000000000000000000000 [合計異なる宣言])。

直接関係はありませんが、Sybase ASE(12.5.0.3)を使用した算術オーバーフローエラーで時間を節約できる可能性があります。

一時テーブルにいくつかのデフォルト値を設定していたので、後で更新するつもりでしたが、算術オーバーフローエラーに遭遇しました。

declare @a numeric(6,3)

select 0.000 as thenumber into #test --indirect declare

select @a = ( select thenumber + 100 from #test )

update #test set thenumber = @a

select * from #test

エラーを表示します:

Arithmetic overflow during implicit conversion of NUMERIC value '100.000' to a NUMERIC field .

私の頭の中では機能するはずですが、 'thenumber'列が宣言されていなかった(または間接的にdecimal(4,3)として宣言されていた)のではありません。したがって、私の場合は000.000のように、スケールと精度を使用して一時テーブル列を間接的に目的の形式に宣言する必要があります。

select 000.000 as thenumber into #test --this solved it

うまくいけば、誰かの時間を節約できます:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top