【发布时间】:2016-06-27 13:56:36
【问题描述】:
我将这种格式用于 MERGE 子句:
DECLARE @Table (ColA int, ColB int, ID int)
INSERT @Table
SELECT changes.ColA,changes.ColB,Changes.Identity
FROM
(
MERGE Target
USING @SourceTable SOURCE
ON Target.ID=Source.ID
WHEN MATCHED AND target.ColA<>soruce.ColA or target.ColB<>source.ColB THEN
UPDATE SET
Target.ColA=source.ColA,
Target.ColB=source.ColB
WHEN NOT MATCHED BY TARGET
INSERT(ColA,ColB)
VALUES(Source.ColA,Source.ColB)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
OUTPUT INSERTED.ColA,INSERTED.ColB,SOURCE.Identity
) AS changes(ColA,ColB,SOURCE.Identity)
然后,我稍后会使用@Table 作为其他 JOINS 的来源。如果没有对 TARGET 表的插入/更新,则 @Table 为空,这会导致整个查询的其余部分出现问题,因为没有任何东西可以加入。
有没有办法捕获SOURCE 行,即使它们没有在TARGET 端进行操作?
我需要使用 MERGE 来检索 INSERT/UPDATES 上的标识列。
【问题讨论】:
-
使用
@SourceTable本身或@Table UNION @SourceTable用于@Table中不存在的行。
标签: sql-server merge