/****************** Merge 演示 ***************************/
/************ 3W@live.cn by 邀月 *******************/
CREATE Table AnimalsInMyYard(sightingdate Date,animal Nvarchar(200));
GO
INSERT INTO AnimalsInMyYard(sightingdate,animal) VALUES ('2011-04-06',N'哈士奇');
INSERT INTO AnimalsInMyYard(sightingdate,animal) VALUES ('2011-04-05',N'狐狸');
INSERT INTO AnimalsInMyYard(sightingdate,animal) VALUES ('2011-04-06',N'狼');
GO
CREATE Table NewSighting(sightingdate Date,animal Nvarchar(200));
GO
INSERT INTO AnimalsInMyYard(sightingdate,animal) VALUES ('2011-04-08',N'兔子');
INSERT INTO AnimalsInMyYard(sightingdate,animal) VALUES ('2011-04-06',N'哈士奇');
INSERT INTO AnimalsInMyYard(sightingdate,animal) VALUES ('2011-04-09',N'狼');
GO
----插入还没有看过的,否则不操作
MERGE AnimalsInMyYard A USING NewSighting N
ON (A.sightingdate = N.sightingdate AND A.Animal = N.Animal)
WHEN NOT MATCHED
THEN INSERT (sightingdate, Animal) VALUES (sightingdate, Animal);
Merge计划变得稍微有点庞大,我们分两部分来看,第一部分如下图:(初始连接以查找已存在的行) http://onexin.iyunv.com/source/plugin/onexin_bigdata/https://public.sn2.livefilestore.com/y1pSmVZINd_ce_87rpges2W2RmfdLKSkjlbC2wAJ-vlCa6qECo2LUgwHWZnDJP9Ul-LVq4MKhUHfDFhruMSiEKgvg/2012-4-7%2014-32-46.png?psid=1
首先读取源表NewSighting,同时查询处理器探测目标表AnimalsInMyYard,查看该行是否己经存在。 Left outer Join隐含的Compute scalar仅仅用于添加一列,如果该值匹配则值为1,如果没有与源表行相匹配的行(由于Left Outer Join的工作原理)则返回Null值。联接上的Compute scalar会生成Action 列: [Action1008] = Scalar Operator(ForceOrder(CASE WHEN [TrgPrb1006] IS NOT NULL THEN NULL ELSE (4) END)) http://onexin.iyunv.com/source/plugin/onexin_bigdata/https://public.sn2.livefilestore.com/y1pRKmK9oAcH8Wl8-vA4wFudne8fS_fm3LzKJapzxaILClIieGSofYbMijGFgCgoMDM2aHvLYbj_YHmwmG3dHzjVA/2012-4-7%2014-33-04.png?psid=1
第二部分:Merge计划:更新、Halloween保护池、行筛选器
在该计划的上半部分,筛选器删除有一次null操作的行(谓词:[Action1008] IS NOT NULL),因为该Merge语句只有一项操作(可能在一条Merge语句中有多项操作)。导出查询命令的脚本能够提供Halloween保护,这表示它会在视图将值写回AnimalsInMyYard表之前使用输入中的所有行。Merge实际上只是一项更新操作,但是显示计划输出已经被更改,以避免出现混淆。