Ree*_*iie 3 t-sql sql-server merge stored-procedures
我目前有一个存储过程,该过程将目标表(Ticket_Report)与数据源表(New_Tickets)进行比较。
我正在使用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
);
Run Code Online (Sandbox Code Playgroud)
我需要做的是,当我找到一个MATCH时,不仅要更新该行,还需要删除该行,然后将其重新插入到目标表中。每当我找到一个匹配项时,谁能告诉我如何一个接一个地删除和插入?
这是一个例子:
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
Run Code Online (Sandbox Code Playgroud)
输出:
id col1 old_col1
4 28 NULL
5 5 7
6 10 14
7 15 21
Run Code Online (Sandbox Code Playgroud)
前3行在两个ID中都具有相同的ID,因此匹配部分将删除这些ID(7、14、21)。剩下28个。然后插入新值并将旧值保留在OUTPUT
子句中。