如何使用MERGE的“当不匹配”在同一个表中插入新记录?

时间:2015-10-03 00:41:20

标签: sql-server sql-server-2012

我正在尝试使用SQL Server的Merge语句对一个表进行upsert。

declare @Mergeoutput table (action varchar(50))

declare variables ...

MERGE Usertable AS target
using (Select .... from Usertable where filter conditions using variables)
    as Source (column names..)
on source.... = target.... (multiple statements)

WHEN MATCHED THEN
  UPDATE SET....

WHEN NOT MATCHED by target THEN
  INSERT (...)
     VALUES (...)
output $action into @Mergeoutput;
select * from @Mergeoutput

如果匹配,则更新有效,但如果没有匹配则不会发生插入。 @Mergeout是空的。我的update和insert语句应该对一行采取行动。当using语句是一个空集并且我想插入一个新行时,Merge如何工作?

更新
这是运行一切的SQL。我希望@Mergeoutput返回'Insert',并且Person表有一个新行。

Create table Person
(
  name varchar(20)
)

declare @Mergeoutput table (action varchar(50))

declare @newName varchar(20)

select @newName  = 'John'

MERGE Person AS target
using (Select name from Person where name= 'John')
    as Source (name)
on source.name = target.name

WHEN MATCHED THEN
  UPDATE SET name = 'John2'

WHEN NOT MATCHED THEN
  INSERT (name)
     VALUES ('John')
output $action into @Mergeoutput;
select * from @Mergeoutput

select * from person

1 个答案:

答案 0 :(得分:1)

通常,您的MERGE语句如下所示:

MERGE INTO @Person AS target
USING
(
    SELECT name 
    FROM @Person 
    WHERE <.......>
) AS Source
ON source.name = target.name

WHEN MATCHED THEN
UPDATE SET name = Source.name

WHEN NOT MATCHED THEN
INSERT (name)
VALUES (Source.name)
;

请注意,我从Source获取值并将其插入Target

  

当没有匹配[目标]那么

     

指定将行插入每行的target_table中   由<table_source> ON <merge_search_condition>返回但没有   匹配target_table中的一行,但确实满足额外的搜索   条件,如果存在。要插入的值由。指定   <merge_not_matched>条款。

因此,如果您的Source为空,则无论ON条件如何,都不会插入任何内容。

您尝试实现的整体逻辑并不是很清楚,但似乎您可能需要在Source查询中使用一些额外的逻辑。