zoukankan      html  css  js  c++  java
  • Sql Server Merge 关键字 一个条语句实现增删改查

     
    简介

    Merge关键字在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。

    可以想象出,需要使用Merge的场景比如:

    • 数据同步
    • 数据转换
    • 基于源表对目标表做Insert,Update,Delete操作

    MERGE语句的基本语法:

    MERGE [TOP ] [into] 目标表
    
    USING 源表
    
    ON 匹配条件
    
    WHEN MATCHED  [AND 其他条件]
    THEN [UPDATE|INSERT|DELETE] 语句
    WHEN NOT MATCHED  [AND 其他条件]
    THEN [UPDATE|INSERT|DELETE] 语句
    WHEN NOT MATCHED BY SOURCE  [AND 其他条件] --SOURCE 是指USING 后面的表 
    THEN [UPDATE|INSERT|DELETE] 语句
     OUTPUT $ACTION AS [Action], --OUTPUT 语句 Merge操作完成后,将所变动的语句进行输出
                     Inserted.SPDID as [新增的],
                     Updated.SPDID as [更新的],
                     Deleted.SPDID as [删除的]
    

    示例 使用Merge 更新,插入和删除

    MERGE INTO [SalesPath_Forecast] a
    USING @TblDataUpdate b--临时表
    ON (b.SPDID = a.SPDID)    
    WHEN MATCHED THEN
    UPDATE SET 
        a.[ForecastAmount] =  b.[ForecastAmount] ,
        a.[RiskAmount] =  b.[RiskAmount] ,
        a.[UpsideAmount] =  b.[UpsideAmount] ,
        a.[BridgeAmount] =  b.[BridgeAmount],                
        a.[RootCauseID] = b.[RootCauseID],
        a.[Remark] = b.[Remark]
                                            
    WHEN NOT MATCHED THEN
    INSERT ([SPDID],….略) 
    VALUES (newid(),….略)WHEN NOT MATCHED BY SOURCE --SOURCE 是指USING 后面的表,在原表中存在目标表中不存在 ,直译: 没有根源表匹配上
    THEN DELETE  
    OUTPUT $ACTION AS [Action], --OUTPUT 语句 Merge操作完成后,将所变动的语句进行输出
    Inserted.SPDID as [新增的],
    Updated.SPDID as [更新的],
    Deleted.SPDID as [删除的];
    
    上面的Merge关键字后面使用了多个WHEN…THEN语句,而这个语句是可选的.也可以仅仅新增或是仅仅删除
    Merge关键字的一些限制
    • 使用Merge关键字只能更新一个表
    • 源表中不能有重复的记录
    小结

    本文简单说明了Merge关键的字的使用。如果你使用的是SQL Server 2008之后的版本,在面对一些比如库存结账之类的业务时,放弃IF…ELSE和手写UPDATE,Insert吧,使用Merge关键字可以使这类操作更加轻松愉悦

  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/Qbit/p/Sql_Server__Merge.html
Copyright © 2011-2022 走看看