Wie man alte Werte in OUTPUT-Klausel mit SQL MERGE-statement abruft

Ich benutze MERGE-statement zu aktualisieren Lassen Sie uns sagen, eine Produkt-Tabelle mit (Name="a", Description="desca") . Meine Quellentabelle enthält (Name="a", Description="newdesca") und ich fusioniere auf dem Feld Name.

In meiner Ausgabe-Klausel möchte ich das Feld vor dem Update -> Description = "desca" . Ich konnte keinen path finden, das zu tun, ich bekomme immer wieder den neuen Wert ("newdesca") .

   

Können Sie nicht einfach die deleted memoryresident-Tabelle verwenden. z.B:

 IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL DROP TABLE #T; CREATE TABLE #T (Name VARCHAR(5), Description VARCHAR(20)); INSERT #T (Name, Description) VALUES ('a', 'desca'), ('b', 'delete'); MERGE #T AS t USING (VALUES ('a', 'newdesca'), ('c', 'insert')) AS m (Name, Description) ON t.Name = m.Name WHEN MATCHED THEN UPDATE SET Description = m.Description WHEN NOT MATCHED BY TARGET THEN INSERT (Name, Description) VALUES (m.Name, m.Description) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $Action, inserted.*, deleted.*; IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL DROP TABLE #T; 

Die Ausgabe davon wäre:

 $Action | Name | Description | Name | Description --------+-------+-------------+------+-------------- INSERT | c | insert | NULL | NULL UPDATE | a | newdesca | a | desca DELETE | NULL | NULL | b | delete