0

SQL Server での私のクエリは、すべてのレコードを更新するのではなく、変更されたレコードのみをマージしようとするように見えるため、MATCHED 句の後に単純な AND ステートメントを挿入すると、1 つのことを除いて完全に機能します。C#では、変数を比較するために変数をさまざまな型にキャストする必要があることを理解していますが、SQLではそうではないと「想定」していました。ソース列は数値 (19,5) で、宛先は小数 (18,4) です。私たちの目的のために、データの切り捨てについては心配していません。最終的にはターゲットを変更して、より多くのデータを保持できるようにします (20,6)

声明は次のとおりです。

WHEN MATCHED 
AND (((ISNULL(source.WorkOrderItemNumber,'') != ISNULL(target.WorkOrderItemNumber,'')) 
OR (ISNULL(CAST(source.WorkOrderQty as DECIMAL(18,4)),0) != ISNULL(target.WorkOrderQty,0)

-- ISNULL(source.WorkOrderQty,0) != ISNULL(target.WorkOrderQty,0)

) 

OR (ISNULL(source.WorkOrderBatchQty,0) != ISNULL(target.WorkOrderBatchQty,0)

))) 

上記のステートメントを実行すると、正しいことを実行し、対応する更新ステートメントを実行しません。2 行目のコメントを外して代わりに使用すると、正しく動作しません。レコードが異なると言って、対応する UPDATE ステートメントを実行します。

WorkOrderBatchQty正常に動作しますが0.00000 AS WorkOrderBatchQty、ステートメントに , をハードコーディングしており、ターゲットの宛先が 10 進数 (18,4)であるという点で異なります。

なぜそれが機能するのかはわかりますが、なぜ両方の方法で機能しないのかわかりませんか? 値を比較するときに SQL がそのようにキャストを使用するとは思いませんでした。14.00000 は 14.0000 とは違うと思いますが、SQL が気にするとは思いませんでした。

ありがとう

4

1 に答える 1

1

MSDN の型変換チャートによると、10 進数と数値の変換(r) には、暗黙的な変換で発生する可能性のある精度や位取りの損失を防ぐために、明示的な CAST が必要です。チャートで大きなアスタリスクを探します。

したがって、次のようなインライン型変換が必要です。

ISNULL(CAST(source.WorkOrderQty AS DECIMAL(18, 4)), 0) != ISNULL(target.WorkOrderQty, 0)
于 2013-05-30T19:46:01.560 に答える