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)行同步?!?通過(guò)這個(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)鍵字的好處
-
首先是更加短小精悍的語(yǔ)句,在SQL Server 2008之前沒(méi)有Merge的時(shí)代,基于源表對(duì)目標(biāo)表進(jìn)行操作需要分別寫(xiě)好幾條Insert,Update,Delete。而使用Merge,僅僅需要使用一條語(yǔ)句就好。下面我們來(lái)看一個(gè)例子。
首先建立源表和目標(biāo)表,并插入相關(guān)的數(shù)據(jù),如圖1所示。
圖1.png
下面我們來(lái)寫(xiě)一個(gè)簡(jiǎn)單的Merge語(yǔ)句,如圖2所示。

所造成的結(jié)果如圖3所示。

最終目標(biāo)表的結(jié)果如圖4所示。

Merge語(yǔ)句還有一個(gè)強(qiáng)大的功能是通過(guò)OUTPUT子句,可以將剛剛做過(guò)變動(dòng)的數(shù)據(jù)進(jìn)行輸出。我們?cè)谏厦娴腗erge語(yǔ)句后加入OUTPUT子句,如圖5所示。

此時(shí)Merge操作完成后,將所變動(dòng)的語(yǔ)句進(jìn)行輸出,如圖6所示。

當(dāng)然了,上面的Merge關(guān)鍵字后面使用了多個(gè)WHEN…THEN語(yǔ)句,而這個(gè)語(yǔ)句是可選的.也可以?xún)H僅新增或是僅僅刪除,如圖7所示。

我們還可以使用TOP關(guān)鍵字限制目標(biāo)表被操作的行,如圖8所示。在圖2的語(yǔ)句基礎(chǔ)上加上了TOP關(guān)鍵字,我們看到只有兩行被更新。

但僅僅是MATCHED這種限制條件往往不能滿(mǎn)足實(shí)際需求,我們可以在圖7那個(gè)語(yǔ)句的基礎(chǔ)上加上AND附加上額外的限制條件,如圖9所示。

Merge關(guān)鍵字的一些限制
- 使用Merge關(guān)鍵字只能更新一個(gè)表
- 源表中不能有重復(fù)的記錄
小結(jié)
本文簡(jiǎn)單說(shuō)明了Merge關(guān)鍵的字的使用。如果你使用的是SQL Server 2008之后的版本,在面對(duì)一些比如庫(kù)存結(jié)賬之類(lèi)的業(yè)務(wù)時(shí),放棄IF…ELSE和手寫(xiě)UPDATE,Insert吧,使用Merge關(guān)鍵字可以使這類(lèi)操作更加輕松愉悅。
