借助派生源表,使用merge对目标表执行update和insert操作

SQL Server (2.1万) 2014-09-10 11:14:46

    这次我们已知有一些表数据,我们要和Sales.SalesReason这个表中的数据做对比,如果和SalesReason表中的Name字段匹配时就更新表中的ReasonType列,如果没有匹配项的时候就插入这一行新的数据。在这里是使用表值构造函数指定源表的多个行,使用表变量存储更新记录,注意表变量的使用范围。代码如下:

declare @SummaryOfChanges table(Change varchar(20))
merge into Sales.SalesReason as target
using(values('Recommendation','Other'),('Review','Marketing'),('Internet','Promotion')) as source([NewName],NewReasonType)
on target.Name=source.[NewName]
when matched then update set ReasonType=source.NewReasonType
when not matched by target then insert(Name,ReasonType) values ([NewName],NewReasonType)
output $action into @SummaryOfChanges;
select Change,COUNT(*) as CountPerChange from @SummaryOfChanges group by Change
    执行完上面的语句之后我们得到下面的结果说明执行了2次插入,1次更新,如图4。那么是不是这样的 呢,我们查看Sales.SalesReason这个表发现原来已经有’Review’这一条数据了,对它执行了更新,剩下的’Recommendation’,’Internet’执行的是插入操作。如果再次执行上面的语句就会得到UPDATE 3这样的结果,因为已经存在这三条数据了所以都执行UPDATE。

借助派生源表,使用merge对目标表执行update和insert操作 (https://www.tiejiang.org/) SQL Server 第1张


作者:Tyler Ning 
出处:http://www.cnblogs.com/tylerdonet/ 

THE END

发表评论