2013-04-19 9 views
14

Uruchamiam scalanie w programie SQL Server. W mojej aktualizacji chcę tylko zaktualizować wiersz, jeśli wartości się zmieniły. Istnieje wiersz wersji, który zwiększa się przy każdej aktualizacji. Poniżej znajduje się przykład:Scal - aktualizuj tylko, jeśli zmieniły się wartości

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

Teraz, jeśli chciałem tylko zaktualizować wiersz, a tym samym przyrost wersję tylko wtedy, gdy nazwa została zmieniona.

Odpowiedz

25

WHEN MATCHED może mieć AND. Również nie trzeba aktualizować 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 
... 

Jeśli LAST_NAME lub FIRST_NAME są pustych, trzeba zadbać o NULL wartości porównując trg.Last_Name <> src.Last_Name, na przykład ISNULL(trg.Last_Name,'') <> ISNULL(src.Last_Name,'')

+0

Czy to powinno być "lub"? Jeśli zmieniło się tylko imię, nadal chcę zaktualizować – TrialAndError

+0

@ TrialAndError: Tak, masz rację. Naprawianie ... – a1ex07

+0

Myślę, że to zadziała idealnie. Nie zdawałem sobie sprawy, że mogę mieć "AND" w części MATCHED. Dziękuję Ci. – TrialAndError

1

Zamiast unikania aktualizacji ogóle, można zmienić swój kod [VERSION] + 1 dodawania zera gdy nazwy odpowiadają:

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

To może pracować jako dobrze, ale @ a1ex07 odpowiedź trochę bardziej do moich potrzeb, ponieważ nie ma potrzeby aktualizowania wartości, jeśli nic się nie zmieni. – TrialAndError

+0

Używam tabel wersji w wersji SQL (tymczasowej) i umieszcza wiersz repliki w przypadku aktualizacji, więc użyłbym odpowiedzi @ a1ex07 zamiast tej – DJIDave

Powiązane problemy