2013-04-19 16 views
14

SQL Server'da bir birleştirme yapıyorum. Güncellememde, değerler değiştiyse yalnızca satırı güncellemek istiyorum. Her güncellemede artan bir sürüm satırı var. Ben sadece satır ve böylece artım sürümünü güncellemek isterse Birleştirme - Yalnızca değerler değiştiyse güncelleştir,

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); 

Şimdi, adı

değişti YALNIZCA: Aşağıda bir örnek verilmiştir. isimler eşleştiğinde

cevap

25

WHEN MATCHEDAND sahip olabilir. Ayrıca, EMP_ID'u güncellemeye gerek yoktur. Last_name veya FIRST_NAME'in null ise a1ex07 cevaptır @

... 
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 
... 

, gelimi ISNULL(trg.Last_Name,'') <> ISNULL(src.Last_Name,'') Bu durum işe yarayabilir

+0

Bu bir' veya 'olabilir mi? Sadece ilk ad değiştiyse, hala – TrialAndError

+0

@ TrialAndError: Evet, haklısınız. Düzeltme ... – a1ex07

+0

Bu mükemmel çalışacağını düşünüyorum. MATCHED kısmında bir 'AND' olabileceğimi farketmedim. Teşekkür ederim. – TrialAndError

1

Aksine tamamen bir güncelleme kaçınarak yerine, sıfır eklemek için [VERSION] + 1 kodunu değiştirmek olabilir:

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

için, trg.Last_Name <> src.Last_Name karşılaştırarak iken NULL değerlerin bakmak gerekir, ancak hiçbir şey değişmezse değerleri güncellemeye gerek olmadığı için ihtiyaçlarim için biraz daha fazla. – TrialAndError

+0

SQL Versioned Tables (temporal) kullanıyorum ve güncellendiyse bir çoğaltma satırı koyarım, bu yüzden @ a1ex07 'nin yerine bu cevabı kullanıyorum – DJIDave

İlgili konular