如何使用SQL MERGE语句检索OUTPUT子句中的旧值

时间:2014-04-23 09:31:26

标签: sql-server

我使用MERGE语句更新,让我们说一个包含(Name="a", Description="desca")的产品表。我的源表包含(Name="a", Description="newdesca"),我在名称字段上合并。

在我的输出条款中,我想在更新前取回字段 - > Description = "desca"。我无法找到办法,我总是找回新值("newdesca")

1 个答案:

答案 0 :(得分:4)

你能不能只使用deleted内存驻留表。 e.g:

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;

这个的输出是:

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