it-swarm.com.de

Verwenden Sie die Where-Klausel mit Merge

In der folgenden Syntax mit dem When Matched kann nur aktualisiert werden, wenn der Wert in der Aktualisierungstabelle vom Wert in der Mitarbeitertabelle abweicht? Etwas Ähnliches wie meine unten stehende DDL - aber dies wirft natürlich einen Fehler auf und funktioniert nicht.

Was sollte ich in meiner Syntax aktualisieren, um nur Zeilen zu aktualisieren, die unterschiedlich sind? Mein gewünschtes Update wäre, nicht jede übereinstimmende Zeile zu wiederholen, sondern nur emp44 & emp55 da die Adresse unterschiedlich ist.

Der dargestellte Fehler ist

Nachricht 156, Ebene 15, Zustand 1, Zeile 24
Falsche Syntax in der Nähe des Schlüsselworts 'WHERE'.

Syntax

  DECLARE @Emp Table (empid varchar(10), empaddress varchar(100))
  Insert Into @Emp Values 
  ('emp11', '111 No Blue'), 
  ('emp22', '222 No Blue'),
  ('emp33', '333 No Blue'), 
  ('emp44', '444 No Blue'),
  ('emp55', '555 No Blue');

Declare @EmpUpdates TABLE (empid varchar(10), empaddress varchar(100))
Insert Into @EmpUpdates Values
('emp11', '111 No Blue'), 
('emp22', '222 No Blue'),
('emp33', '333 No Blue'), 
('emp44', '999 No Blue'),
('emp55', '888 No Blue'),
('emp66', '4141 No Blue');

MERGE @Emp emp
Using @EmpUpdates eup
ON emp.empid = eup.empid
 WHEN MATCHED THEN
UPDATE
SET emp.empaddress = eup.empaddress
WHERE emp.empaddress <> eup.empaddress
WHEN NOT MATCHED BY TARGET THEN
INSERT (empid, empaddress)
VALUES(eup.empid, eup.empaddress)
7

In diesem Teil der Anweisung WHERE befindet sich kein MERGE. Siehe MERGE (Transact-SQL) in der Dokumentation zur Syntaxhilfe.

Es gibt einen optionalen AND Teil in WHEN MATCHED Klausel, so dass die einfache Antwort darin besteht, die Bedingung dorthin zu verschieben:

MERGE @Emp emp
USING @EmpUpdates eup
ON emp.empid = eup.empid
WHEN MATCHED 
     AND emp.empaddress <> eup.empaddress
  THEN
    UPDATE
    SET emp.empaddress = eup.empaddress
WHEN NOT MATCHED BY TARGET 
  THEN 
    INSERT (empid, empaddress)
    VALUES (eup.empid, eup.empaddress) ;

Achten Sie darauf, dass Nullen dort korrekt behandelt werden (wenn empaddress nullbar ist).

Es ist manchmal expliziter (und effizienter), die Operationen in zwei separaten Anweisungen (in Ihrem Fall UPDATE und INSERT) in einer Transaktion auszuführen.

Beachten Sie auch, dass es --- gab (und immer noch gibt) einige Probleme mit MERGE .

19
ypercubeᵀᴹ