4年前 (2014-09-10)  SQL Server |   抢沙发  45 
文章评分 0 次,平均分 0.0

    这次我们已知有一些表数据,我们要和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操作


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

 

除特别注明外,本站所有文章均为铁匠运维网原创,转载请注明出处来自http://www.tiejiang.org/1919.html

关于

发表评论

暂无评论

切换注册

登录

忘记密码 ?

切换登录

注册

扫一扫二维码分享