通常、これらの行が最初にターゲット テーブルに入力される方法は、まばらな数の列に大部分がテキスト データで入力され、残りの列は NULL に設定されます。後続のパスでは、新しいデータが既存の既知 (null 以外) および不明 (NULL) データに入力されます。新しいデータ ( #pld ) には実際に異なるデータが含まれていることを確認しました。データは変更されていないようです。ここに私が持っているものがあります:
BEGIN TRANSACTION
BEGIN TRY
MERGE INTO [metro].listings AS metroList
USING #pld as listnew
ON metroList.id = listnew.id
AND metroList.sid = listnew.sid
WHEN MATCHED AND (
metroList.User != listnew.User
or metroList.Email != listnew.Email
or metroList.LocName != listnew.LocName
) THEN
UPDATE SET
metroList.User = listnew.User,
metroList.Email = listnew.Email,
metroList.LocName = listnew.LocName,
WHEN NOT MATCHED THEN
INSERT
( User,
Email,
LocName
)
VALUES
(
listnew.User,
listnew.Email,
listnew.LocName
);
COMMIT TRANSACTION
END TRY
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH
ステートメントの更新部分の下にある != を <> に置き換えてみました。同じ結果です。これは、可能性のある (可能性の高い) null 値と文字列の比較に関連している必要があります。おそらく別の null でしょうか? とにかく、私はすべてのSQLマニアにこれを解くよう呼びかけています。