2013-04-19 19 views
14

Sto eseguendo un'unione in SQL Server. Nel mio aggiornamento, voglio aggiornare la riga solo se i valori sono cambiati. Esiste una riga di versione che incrementa su ogni aggiornamento. Di seguito è riportato un esempio:Unisci: aggiornamento solo se i valori sono stati modificati

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

Ora, se volevo solo aggiornare la riga, e la versione in tal modo di incremento, solo se il nome è cambiato.

risposta

25

WHEN MATCHED può avere AND. Inoltre, non è necessario aggiornare EMP_ID.

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

Se Last_Name o First_Name sono nullable, è necessario prendersi cura di NULL valori, mentre il confronto trg.Last_Name <> src.Last_Name, per esempio ISNULL(trg.Last_Name,'') <> ISNULL(src.Last_Name,'')

+0

Se questo dovesse essere un 'o'? Se solo il primo nome è cambiato, voglio comunque aggiornare – TrialAndError

+0

@ TrialAndError: Sì, hai ragione. Fixing ... – a1ex07

+0

Penso che funzionerà perfettamente. Non mi rendevo conto che avrei potuto avere un 'AND' nella parte MATCHED. Grazie. – TrialAndError

1

piuttosto che evitare un aggiornamento del tutto, si potrebbe modificare il codice per aggiungere [VERSION] + 1 zero quando i nomi corrispondono:

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

Questo potrebbe funzionare bene, ma @ a1ex07 risposta è un po 'di più alle mie esigenze in quanto non è necessario aggiornare i valori se nulla è cambiato. – TrialAndError

+0

Sto usando tabelle con versioni SQL (temporali) e che inserisce una riga di replica in se aggiornato, quindi userei la risposta di @ a1ex07 piuttosto che questa – DJIDave

Problemi correlati