Nar*_*esh 3 sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012
我有一个MERGE更新数据的查询.如果没有匹配,我将源记录插入到获取输出到临时表.
是否可以将匹配的记录输入临时表?基本上为了避免在进一步处理中重复数据,我需要有匹配记录的副本.
这是我的MERGE命令:
MERGE Product.ProductHeaderRepository AS t
USING (SELECT GETDATE() as d, c1, c2, c3,
Name FROM Supplier.ProductHeaderImport
WHERE (BatchID = @BatchID) ) AS s
ON dbo.GetProductHeaderId(s.c1,S.c2,S.c3) <0
WHEN NOT MATCHED BY TARGET THEN
INSERT (Name, c1,c2,c3) VALUES (Name, c2,c2,c3)
OUTPUT INSERTED.iD, s.c1, s.c2, s.c3 INTO @TmpTable;
Run Code Online (Sandbox Code Playgroud)
Gar*_*thD 11
您可以创建一个MATCHED不会更改任何内容的子句,只需更新变量,例如
DECLARE @T1 TABLE (A INT, B INT);
DECLARE @T2 TABLE (A INT, B INT);
DECLARE @T3 TABLE (Action VARCHAR(20), A INT, B INT);
INSERT @T1 VALUES (1, 1), (2, 2), (3, 3);
INSERT @T2 VALUES (1, 0), (2, NULL), (4, 0);
DECLARE @I INT; -- VARIABLE TO UPDATE
MERGE @T2 B
USING @T1 A
ON A.A = B.A
WHEN MATCHED THEN
UPDATE SET @I = 1 -- DO NOTHING MEANINGFUL IN THE UPDATE;
WHEN NOT MATCHED BY TARGET THEN
INSERT (A, B) VALUES (A.A, A.B)
OUTPUT $action, ISNULL(inserted.A, deleted.A), ISNULL(inserted.B, deleted.B) INTO @T3;
SELECT *
FROM @T3;
Run Code Online (Sandbox Code Playgroud)
将返回:
Action A B
INSERT 3 3
UPDATE 1 0
UPDATE 2 NULL
Run Code Online (Sandbox Code Playgroud)
因此,如果您添加新列以@TmpTable存储操作,则可以使用以下方法获取匹配的行:
SELECT *
FROM @TmpTable
WHERE Action = 'UPDATE';
Run Code Online (Sandbox Code Playgroud)
你的新行使用:
SELECT *
FROM @TmpTable
WHERE Action = 'INSERT';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11247 次 |
| 最近记录: |