2015-12-22 68 views
2

我目前有一个存储过程,将我的目标表(Ticket_Report)与我的数据源表(New_Tickets)进行比较。SQL MERGE INTO - 如何删除然后插入匹配的/现有的数据?

我正在使用MERGE INTO语句来比较这两个。当它找到两个表之间的匹配时,它会使用源表中的相应信息更新目标表中的当前行。如果它找到了一个匹配项,它会将源表中的数据插入到目标表中。

MERGE INTO Ticket_REPORT T1 
    USING @New_Tickets T2 
    ON T1.TICKET_NO=T2.TICKET_NO 
    WHEN MATCHED THEN 
    UPDATE SET 
     T1.TICKET_NO = T2.TICKET_NO, 
     T1.ASSIGNED_GROUP = T2.ASSIGNED_GROUP, 
     T1.ASSIGNEE = T2.ASSIGNEE, 
     T1.FNAME = T2.FNAME, 
     T1.LNAME = T2.LNAME 
WHEN NOT MATCHED THEN 
    INSERT VALUES(
     T2.TICKET_NO, 
     T2.ASSIGNED_GROUP, 
     T2.ASSIGNEE, 
     T2.FNAME, 
     T2.LNAME 
); 

我需要做的是,当我找到一个匹配,而不是只更新该行,我需要删除该行,并重新插入到目标表中。任何人都可以告诉我如何同时删除和插入一个接一个找到匹配吗?

回答

1

下面是一个例子:

DECLARE @t1 TABLE(id INT IDENTITY, col1 INT) 
DECLARE @t2 TABLE(id INT IDENTITY, col1 INT, old_col1 INT) 

INSERT INTO @t1(col1) VALUES(5), (10), (15) 
INSERT INTO @t2(col1) VALUES(7), (14), (21), (28) 

MERGE INTO @t2 t2 
USING @t1 t1 ON t1.id = t2.id 
WHEN MATCHED THEN DELETE 
WHEN NOT MATCHED THEN INSERT VALUES(t1.col1, NULL) 
OUTPUT t1.col1, Deleted.col1 INTO @t2(col1, old_col1); 

SELECT * FROM @t2 
ORDER BY id 

输出:

id col1 old_col1 
4 28 NULL 
5 5  7 
6 10 14 
7 15 21 

前三行有两个相同的ID,因此匹配部件将删除那些(7,14,21)。 28将继续。并且您插入新值并将旧值保留在OUTPUT子句中。

+0

我能够捕获OUTPUT中的删除行,然后INTO作为插入语句工作吗? – Reeggiie

+0

@Reeggiie,是的。该示例演示了这一点。 –

相关问题