我正在尝试使用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
答案 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
查询中使用一些额外的逻辑。