-1

次のようなグローバル一時テーブルから更新を実行しています。

update some_table
set Amount = (##GlobalTable.InitialAmount) + (##GlobalTable.[Difference])
from ##GlobalTable
where Amount = ##GlobalTable.InitialAmount

Amount、InitialAmount、およびDifference列はすべてnumeric(21,2)です。

AmountとInitialAmountは常に正です。問題は、差が負の場合、結果の量が実際には負の差によって増加することです。減算を実行する必要がありますが、そうではありません。差が正の場合、正常に機能します。なぜこれが起こっているのか考えはありますか?

SQL Server2008R2を使用しているWindows7EnterpriseSP164ビットを使用しています

4

1 に答える 1

0

これが発生する可能性のある1つの方法...(ただし、表示されているものとは異なる場合があります)

## GlobalTableに、InitialAmountの値は同じで、Differenceの値が異なる2つの行があるかどうかを確認します。

その場合、some_tableの行は## GlobalTableの両方(またはそれ以上)の行と一致する可能性があり、SQLServerはどのような答えが得られるかを保証しません。

私の経験では、SQLServerは更新で使用する行を選択します。これは通常、実行プランに基づいて##GlobalTableから取得された最後の修飾行です。実行プランはテーブルの内容が変更されると変更される可能性があるため、結果はそれほど予測可能ではなく、コードを記述するときに信頼できるものではありません。

## GlobalTableの各行にInitialAmountの一意の値があることがわかっている場合を除き、some_tableを##GlobalTableと結合するためのより信頼性の高い方法を選択する必要があります。

于 2012-07-20T21:58:35.647 に答える