rge对目标表执行update和insert操作
这次我们已知有一些表数据,我们要和Sales.SalesReason这个表中的数据做对比,如果和SalesReason表中的Name字段匹配时就更新表中的ReasonType列,如果没有匹配项的时候就插入这一行新的数据。在这里是使用表值构造函数指定源表的多个行,使用表变量存储更新记录,注意表变量的使用范围。代码如下:
1 declare @SummaryOfChanges table(Change varchar(20))2 merge into Sales.SalesReason as target3 using(values(Recommendation,Other),(Review,Marketing),(Internet,Promotion)) as source([NewName],NewReasonType)4 on target.Name=source.[NewName]5 when matched then update set ReasonType=source.NewReasonType6 when not matched by target then insert(Name,ReasonType) values ([NewName],NewReasonType)7 output $action into @SummaryOfChanges;8 select Change,COUNT(*) as CountPerChange from @SummaryOfChanges group by Change执行完上面的语句之后我们得到下面的结果说明执行了2次插入,1次更新,如图4。那么是不是这样的 呢,我们查看Sales.SalesReason这个表发现原来已经有’Review’这一条数据了,对它执行了更新,剩下的’Recommendation’,’Internet’执行的是插入操作。如果再次执行上面的语句就会得到UPDATE 3这样的结果,因为已经存在这三条数据了所以都执行UPDATE。

图4
将merge执行的结果插入到另外一个表中
我们还可以将merge操作得到的结果写入到另外一个表中,如下的语句将更新的每条数据信息写入到一个新建的表Production.UpdatedInventory中,代码如下:
1 INSERT INTO Production.UpdatedInventory 2 SELECT ProductID, LocationID, NewQty, PreviousQty 3 FROM 4 ( MERGE Production.ProductInventory AS target 5 USING (SELECT ProductID, SUM(OrderQty) 6 FROM Sales.SalesOrderDetail AS sod 7 JOIN Sales.SalesOrderHeader AS soh 8 ON sod.SalesOrderID = soh.SalesOrderID 9 AND soh.OrderDate BETWEEN 20030701 AND 200307311