新聞中心
SQL Server 2008中的MERGE語(yǔ)句能做很多事情,它的功能是根據(jù)源表對(duì)目標(biāo)表執(zhí)行插入、更新或刪除操作。最典型的應(yīng)用就是進(jìn)行兩個(gè)表的同步。

我們注重客戶提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)服務(wù),我們努力開(kāi)拓更好的視野,通過(guò)不懈的努力,創(chuàng)新互聯(lián)建站贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),微信平臺(tái)小程序開(kāi)發(fā),網(wǎng)站開(kāi)發(fā),技術(shù)開(kāi)發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫(kù)的技術(shù)開(kāi)發(fā)工程師。
下面通過(guò)一個(gè)簡(jiǎn)單示例來(lái)演示MERGE語(yǔ)句的使用方法,假設(shè)數(shù)據(jù)庫(kù)中有兩個(gè)表Product及ProductNew,我們的任務(wù)是將Product的數(shù)據(jù)同步到ProductNew(當(dāng)然同步可能是每天通過(guò)Job來(lái)自動(dòng)完成的,在此我們只關(guān)注MERGE的使用)。
以下SQL創(chuàng)建示例表
--源表
- CREATE TABLE Product
- (
- ProductID varchar(7) NOT NULL PRIMARY KEY,
- ProductName varchar(100) NOT NULL,
- Price decimal(13,2) DEFAULT 0
- );
- INSERT INTO Product
- Values
- ('4100037','優(yōu)盤(pán)',50),
- ('4100038','鼠標(biāo)',30);
--目標(biāo)表
- CREATE TABLE ProductNew
- (
- ProductID varchar(7) NOT NULL PRIMARY KEY,
- ProductName varchar(100) NOT NULL,
- Price decimal(13,2) DEFAULT 0
- );
下面再來(lái)關(guān)注MERGE語(yǔ)句的基本語(yǔ)法:
- MERGE 目標(biāo)表
- USING 源表
- ON 匹配條件
- WHEN MATCHED THEN
- 語(yǔ)句
- WHEN NOT MATCHED THEN
- 語(yǔ)句;
以上是MERGE的最最基本的語(yǔ)法,語(yǔ)句執(zhí)行時(shí)根據(jù)匹配條件的結(jié)果,如果在目標(biāo)表中找到匹配記錄則執(zhí)行WHEN MATCHED THEN后面的語(yǔ)句,如果沒(méi)有找到匹配記錄則執(zhí)行WHEN NOT MATCHED THEN后面的語(yǔ)句。注意源表可以是表,也可以是一個(gè)子查詢語(yǔ)句。
格外強(qiáng)調(diào)一點(diǎn),MERGE語(yǔ)句***的分號(hào)是不能省略的!
回到我們的示例,顯然Product與ProductNew表的MERGE匹配條件為主鍵ProductID字段,初始情況下,ProductNew表為空,此時(shí)肯定執(zhí)行的是WHEN NOT MATCHED THEN后的語(yǔ)句,我們先只考慮源表遞增的情況,MERGE語(yǔ)句如下:
- MERGE ProductNew AS d
- USING
- Product
- AS s
- ON s.ProductID = d.ProductId
- WHEN NOT MATCHED THEN
- INSERT( ProductID,ProductName,Price)
- VALUES(s.ProductID,s.ProductName,s.Price);
運(yùn)行后2行受影響,我們已經(jīng)將Product表的數(shù)據(jù)同步到了ProductNew表。
現(xiàn)在,我們更新Product表4100037產(chǎn)品的價(jià)格,將其修改為55:
- UPDATE Product SET Price=55 WHERE ProductID='4100037';
我們也希望每天同步的時(shí)候應(yīng)該將更新后的價(jià)格同步到ProductNew表,顯然此時(shí)在MERGE語(yǔ)句中應(yīng)該添加WHEN MATCHED THEN 語(yǔ)句,該語(yǔ)句來(lái)更新ProductNew表的價(jià)格,添加匹配更新后的MERGE語(yǔ)句:
- MERGE ProductNew AS d
- USING
- Product
- AS s
- ON s.ProductID = d.ProductId
- WHEN NOT MATCHED THEN
- INSERT( ProductID,ProductName,Price)
- VALUES(s.ProductID,s.ProductName,s.Price)
- WHEN MATCHED THEN
- UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
執(zhí)行后2行受影響,為什么是兩行呢?因?yàn)槲覀兊钠ヅ錀l件只是按ProductID來(lái)關(guān)聯(lián)的,這樣匹配出來(lái)的記錄為2行。另外,我們的UPDATE語(yǔ)句里面沒(méi)有更新ProductID字段,因?yàn)檫@是完全沒(méi)必要的(如果修改了ProductID字段會(huì)直接走到NOT MATCHED)。
現(xiàn)在做個(gè)破壞,我們將410037產(chǎn)品刪除掉:
- DELETE Product WHERE ProductID='4100037';
明顯,上面給出的MERGE語(yǔ)句無(wú)法同步這種情況,再次回到MERGE語(yǔ)句的定義,對(duì)MERGE的WHEN NOT MATCHED THEN語(yǔ)句稍作擴(kuò)展:
- WHEN NOT MATCHED BY TARGET
表示目標(biāo)表不匹配,BY TARGET是默認(rèn)的,所以上面我們直接使用WHEN NOT MATCHED THEN
- WHEN NOT MATCHED BY SOURCE
表示源表不匹配,即目標(biāo)表中存在,源表中不存在的情況。
OK,現(xiàn)在我們要完成源表DELETE后,目標(biāo)表的同步動(dòng)作,MERGE語(yǔ)句如下:
- MERGE ProductNew AS d
- USING
- Product
- AS s
- ON s.ProductID = d.ProductId
- WHEN NOT MATCHED BY TARGET THEN
- INSERT( ProductID,ProductName,Price)
- VALUES(s.ProductID,s.ProductName,s.Price)
- WHEN NOT MATCHED BY SOURCE THEN
- DELETE
- WHEN MATCHED THEN
- UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
嗯,上面已經(jīng)使用到MERGE語(yǔ)句中的INSERT、UPDATE、DELETE語(yǔ)句,這足夠完成大多數(shù)的同步功能了。當(dāng)然,MERGE語(yǔ)句還有很多的選項(xiàng),在此不做詳述,請(qǐng)參考MSDN
鏈接:http://www.cnblogs.com/xfrog/archive/2010/10/13/1850602.html
網(wǎng)站標(biāo)題:詳解SQLServer2008中的MERGE語(yǔ)句
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/dphejoi.html


咨詢
建站咨詢
