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 が気にするとは思いませんでした。
ありがとう