I would use the OUTPUT clause with the $action column:
DECLARE @Target TABLE ( Id INT NOT NULL, Value VARCHAR(10) NULL ); INSERT @Target VALUES (1, 'A'), (2, NULL), (3, NULL); DECLARE @Source TABLE ( Id INT NOT NULL, Value VARCHAR(10) NULL ); INSERT @Source VALUES (2, 'B'), (4, 'D'), (5, 'E'); DECLARE @AffectedRows TABLE ( MergeAction NVARCHAR(10) NOT NULL, Old_Id INT NULL, Old_Value VARCHAR(10) NULL, New_Id INT NULL, New_Value VARCHAR(10) NULL ); MERGE @Target t USING @Source s ON t.Id = s.Id WHEN MATCHED THEN UPDATE SET Value = s.Value WHEN NOT MATCHED THEN INSERT (Id, Value) VALUES (s.Id, s.Value) OUTPUT $action, deleted.Id, deleted.Value, inserted.Id, inserted.Value INTO @AffectedRows(MergeAction, Old_Id, Old_Value, New_Id, New_Value); SELECT * FROM @Target; SELECT * FROM @AffectedRows;
Results:
Id Value -- ----- 1 A 2 B <-- updated row 3 NULL 4 D <-- inserted row 5 E <-- inserted row MergeAction Old_Id Old_Value New_Id New_Value ----------- ----------- ---------- ----------- --------- INSERT NULL NULL 4 D INSERT NULL NULL 5 E UPDATE 2 NULL 2 B
Bogdan sahlean
source share