2015-10-03 51 views
3

我正在嘗試使用SQL Server的Merge語句對單個表執行upsert。如何使用MERGE的'When not matched'在同一個表中插入新記錄?

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是空的。我的更新和插入語句應該對一行進行操作。當using語句是一個空集並且我想要插入一個新行時,Merge如何工作?

更新:
這是運行一切的SQL。我期望@Mergeoutput返回'插入'和人表有一個新的行。

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

請用示例表格和所需輸出預先準備http://sqlfiddle.com。這是有點不清楚你想達到什麼。它看起來像[這裏](http://stackoverflow.com/a/10795503/5070879) – lad2025

+0

sqlfiddle不斷給我一個合併語句的錯誤。看到我上面的更新。 –

+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

WHEN NOT MATCHED [BY TARGET] THEN

指定一個行插入到target_table用於通過<table_source> ON <merge_search_condition>返回的每行 一點不 匹配在target_table一排,但確實滿足一個額外的如果存在,則搜索 條件。要插入的值由 <merge_not_matched>子句指定。

因此,如果您的Source爲空,則不會插入任何內容,而不考慮ON條件。

目前還不清楚您嘗試實現的總體邏輯,但似乎您可能需要在Source查詢中有一些額外的邏輯。

+0

我想我完全不理解合併語句。使用( SELECT @NewName)AS源工作。這個想法是,插入的工作不能爲空。我可能只是使用老式的if .. insert其他更新。 –

+0

當你有兩個不同的表格,你需要同步它們時,MERGE會很好用。對同一張表使用'MERGE'聽起來很奇怪。就你所說的來說,使用明確的「IF」可能會更容易,更好。它取決於IF中的邏輯以及是否有單行或多行更新和插入。 –

相關問題