Merge關(guān)鍵字是一個(gè)神奇的DML關(guān)鍵字。它在SQL Server 2008被引入,它能將Insert,Update,Delete簡(jiǎn)單的并為一句。MSDN對于Merge的解釋非常的短小精悍:”根據與源表聯(lián)接的結果,對目標表執行插入、更新或刪除操作。例如,根據在另一個(gè)表中找到的差異在一個(gè)表中插入、更新或刪除行,可以對兩個(gè)表進(jìn)行同步?!?通過(guò)這個(gè)描述,我們可以看出Merge是關(guān)于對于兩個(gè)表之間的數據進(jìn)行操作的。
可以想象出,需要使用Merge的場(chǎng)景比如:
首先是更加短小精悍的語(yǔ)句,在SQL Server 2008之前沒(méi)有Merge的時(shí)代,基于源表對目標表進(jìn)行操作需要分別寫(xiě)好幾條Insert,Update,Delete。而使用Merge,僅僅需要使用一條語(yǔ)句就好。下面我們來(lái)看一個(gè)例子。
首先建立源表和目標表,并插入相關(guān)的數據,如圖1所示。
圖1.創(chuàng )建測試表并插入測試數據
下面我們來(lái)寫(xiě)一個(gè)簡(jiǎn)單的Merge語(yǔ)句,如圖2所示。
圖2.一個(gè)簡(jiǎn)單的Merge語(yǔ)句
所造成的結果如圖3所示。
圖3.Merge語(yǔ)句對于目標表的更新
最終目標表的結果如圖4所示。
圖4.最后目標表的結果
Merge語(yǔ)句還有一個(gè)強大的功能是通過(guò)OUTPUT子句,可以將剛剛做過(guò)變動(dòng)的數據進(jìn)行輸出。我們在上面的Merge語(yǔ)句后加入OUTPUT子句,如圖5所示。
圖5.Merge語(yǔ)句后加上OUTPUT子句
此時(shí)Merge操作完成后,將所變動(dòng)的語(yǔ)句進(jìn)行輸出,如圖6所示。
圖6.輸出Merge操作產(chǎn)生的數據變更
當然了,上面的Merge關(guān)鍵字后面使用了多個(gè)WHEN…THEN語(yǔ)句,而這個(gè)語(yǔ)句是可選的.也可以?xún)H僅新增或是僅僅刪除,如圖7所示。
圖7.僅僅插入的Merge語(yǔ)句
我們還可以使用TOP關(guān)鍵字限制目標表被操作的行,如圖8所示。在圖2的語(yǔ)句基礎上加上了TOP關(guān)鍵字,我們看到只有兩行被更新。
圖8.使用TOP關(guān)鍵字的Merge語(yǔ)句
但僅僅是MATCHED這種限制條件往往不能滿(mǎn)足實(shí)際需求,我們可以在圖7那個(gè)語(yǔ)句的基礎上加上AND附加上額外的限制條件,如圖9所示。
圖9.加上了AND限制條件的Merge語(yǔ)句
本文簡(jiǎn)單說(shuō)明了Merge關(guān)鍵的字的使用。如果你使用的是SQL Server 2008之后的版本,在面對一些比如庫存結賬之類(lèi)的業(yè)務(wù)時(shí),放棄IF…ELSE和手寫(xiě)UPDATE,Insert吧,使用Merge關(guān)鍵字可以使這類(lèi)操作更加輕松愉悅。
聯(lián)系客服