2013-04-19 60 views
14

SQL Serverでマージを実行しています。私の更新では、値が変更された場合にのみ行を更新したいと考えています。更新ごとに増分するバージョン行があります。以下は例です:今マージ - 値が変更された場合のみ更新します。

MERGE Employee as tgt USING 
(SELECT Employee_History.Emp_ID 
, Employee_History.First_Name 
, Employee_History.Last_Name 
FROM Employee_History) 
as src (Emp_ID,First_Name,Last_Name) 
ON tgt.Emp_ID = src.Emp_ID 
WHEN MATCHED THEN 
    UPDATE SET 
    Emp_ID = src.Emp_ID, 
    ,[VERSION] = tgt.VERSION + 1 
    ,First_Name = src.First_Name 
    ,Last_Name = src.Last_Name 
WHEN NOT MATCHED BY target THEN 
    INSERT (Emp_ID,0,First_Name,Last_Name) 
VALUES 
    (src.Emp_ID,[VERSION],src.First_Name,src.Last_Name); 

、私は名前だけが変更された場合にのみ、行を更新し、したがってバージョンをインクリメントしたい場合。

答えて

25

WHEN MATCHEDANDを持つことができます。また、EMP_IDを更新する必要はありません。 LAST_NAMEまたはFIRST_NAMEがNULL可能である場合a1ex07答えがある@

... 
WHEN MATCHED AND (trg.First_Name <> src.First_Name 
    OR trg.Last_Name <> src.Last_Name) THEN UPDATE 
    SET 
    [VERSION] = tgt.VERSION + 1 
    ,First_Name = src.First_Name 
    ,Last_Name = src.Last_Name 
... 

は、インスタンスISNULL(trg.Last_Name,'') <> ISNULL(src.Last_Name,'')これは、同様に仕事ができる

+0

これは 'または'でしょうか?最初の名前が変更された場合は、私はまだ更新したい – TrialAndError

+0

@ TrialAndError:うん、そうです。 Fixing ... – a1ex07

+0

これは完全に動作すると思います。私は、マッチした部分に「AND」を付けることができなかったことを認識しませんでした。ありがとうございました。 – TrialAndError

1

よりもむしろ完全に更新を避け、あなたは名前が一致したときにゼロを追加するために、あなたの[VERSION] + 1コードを変更することができます:

[VERSION] = tgt.VERSION + (CASE 
    WHEN tgt.First_Name <> src.First_Name OR tgt.Last_Name <> src.Last_Name 
    THEN 1 
    ELSE 0 END) 
+0

ため、trg.Last_Name <> src.Last_Nameを比較しながらNULL値の世話をする必要がありますが、何も変更しなければ値を更新する必要がないので、もう少し私のニーズに合っています。 – TrialAndError

+0

私はSQLのバージョン付きテーブル(一時的)を使用しています。これは更新された場合はレプリカの行を入れますので、これよりも@ a1ex07の答えを使用します – DJIDave

関連する問題