Merge關(guān)鍵字是一個(gè)神奇的DML關(guān)鍵字艰躺。它在SQL Server 2008被引入清寇,它能將Insert,Update,Delete簡(jiǎn)單的并為一句尺铣。MSDN對(duì)于Merge的解釋非常的短小精悍:”根據(jù)與源表聯(lián)接的結(jié) 果颂暇,對(duì)目標(biāo)表執(zhí)行插入硕旗、更新或刪除操作窗骑。例如,根據(jù)在另一個(gè)表中找到的差異在一個(gè)表中插入漆枚、更新或刪除行创译,可以對(duì)兩個(gè)表進(jìn)行同步∏交”,通過這個(gè)描述软族,我們 可以看出Merge是關(guān)于對(duì)于兩個(gè)表之間的數(shù)據(jù)進(jìn)行操作的, 可以想象出残制,需要使用Merge的場(chǎng)景比如:
- 數(shù)據(jù)同步
- 數(shù)據(jù)轉(zhuǎn)換
- 基于源表對(duì)目標(biāo)表做Insert,Update,Delete操作
使用Merge關(guān)鍵字的好處
-
首先是更加短小精悍的語句立砸,在SQL Server 2008之前沒有Merge的時(shí)代,基于源表對(duì)目標(biāo)表進(jìn)行操作需要分別寫好幾條Insert,Update,Delete痘拆。而使用Merge,僅僅需要使用一條語句就好仰禽。下面我們來看一個(gè)例子。
首先建立源表和目標(biāo)表纺蛆,并插入相關(guān)的數(shù)據(jù),如圖1所示吐葵。
圖1.png
下面我們來寫一個(gè)簡(jiǎn)單的Merge語句,如圖2所示。
所造成的結(jié)果如圖3所示桥氏。
最終目標(biāo)表的結(jié)果如圖4所示温峭。
Merge語句還有一個(gè)強(qiáng)大的功能是通過OUTPUT子句,可以將剛剛做過變動(dòng)的數(shù)據(jù)進(jìn)行輸出字支。我們?cè)谏厦娴腗erge語句后加入OUTPUT子句,如圖5所示凤藏。
此時(shí)Merge操作完成后奸忽,將所變動(dòng)的語句進(jìn)行輸出,如圖6所示。
當(dāng)然了揖庄,上面的Merge關(guān)鍵字后面使用了多個(gè)WHEN…THEN語句栗菜,而這個(gè)語句是可選的.也可以僅僅新增或是僅僅刪除,如圖7所示。
我們還可以使用TOP關(guān)鍵字限制目標(biāo)表被操作的行蹄梢,如圖8所示疙筹。在圖2的語句基礎(chǔ)上加上了TOP關(guān)鍵字,我們看到只有兩行被更新禁炒。
但僅僅是MATCHED這種限制條件往往不能滿足實(shí)際需求而咆,我們可以在圖7那個(gè)語句的基礎(chǔ)上加上AND附加上額外的限制條件,如圖9所示幕袱。
Merge關(guān)鍵字的一些限制
- 使用Merge關(guān)鍵字只能更新一個(gè)表
- 源表中不能有重復(fù)的記錄
小結(jié)
本文簡(jiǎn)單說明了Merge關(guān)鍵的字的使用暴备。如果你使用的是SQL Server 2008之后的版本,在面對(duì)一些比如庫(kù)存結(jié)賬之類的業(yè)務(wù)時(shí)们豌,放棄IF…ELSE和手寫UPDATE涯捻,Insert吧,使用Merge關(guān)鍵字可以使這類操作更加輕松愉悅玛痊。