从一个数据库的一张表同步数据到另外一个数据库的一张表,同步的数据不是insert就是update。

一般做法是先判断当前数据在另外一张表存不存在,存在则更新,不存在则插入。需要一次查询判断:exist或count(*)>0,

然而用Merge Into 更为简洁:

CREATE PROC [dbo].[XXX_SynchroMaterial]
@userID nvarchar(50)
as
begin
declare @nResult int; --同步多少条物料 declare @totalRows int;
set @nResult=0; --建立临时数据表
create table #tmpMateriel
(
[id] int IDENTITY(1,1) ,
MaterielGUID nvarchar(50),
MaterielCode nvarchar(50),
MaterielName nvarchar(255),
ParentNode nvarchar(50),
IfLeafNode bit,
Material_Category int null,
Raw_Material_Category int null
) --读取物料中间表数据,插入到临时表
insert into #tmpMateriel(MaterielGUID,MaterielCode,MaterielName,ParentNode,IfLeafNode,Material_Category,Raw_Material_Category)
SELECT [MaterielGUID]
,[MaterielCode]
,[MaterielName]
,[ParentNode]
,[IfLeafNode]
,CASE WHEN (MaterielCode like '1.03%' or MaterielCode like '2.02%') THEN 1
WHEN (MaterielCode like '1.04%' or MaterielCode like '2.03%') THEN 2
ELSE 3
END
,CASE WHEN [IfLeafNode]=1 THEN 4 --小料
ELSE null
END FROM [ChwareXXXInterface].[dbo].[Tab_Materiel_Interface] where [If_Read]=0; select @nResult=COUNT(*) from #tmpMateriel; Merge Into [ChwareXXX].[dbo].[Tab_Material] t
USING (select [MaterielCode],[MaterielName],[ParentNode],[IfLeafNode],[Material_Category],[Raw_Material_Category] from #tmpMateriel)as s
on t.[MaterialCode]=s.[MaterielCode]
When Matched Then Update set t.[MaterialName]=s.[MaterielName],
t.[ParentNode]=s.[ParentNode],
t.[IfLeafNode]=s.[IfLeafNode],
t.[Material_Category]=s.[Material_Category],
t.[Raw_Material_Category]=s.[Raw_Material_Category],
t.[ModifyUser]=@userID,
t.[ModifyDT]=getdate()
When Not Matched Then Insert ([MaterialCode],[MaterialName],[ParentNode],[IfLeafNode],[Material_Category],[Raw_Material_Category],[CreateUser],[CreateDt])
values (s.[MaterielCode],s.[MaterielName],s.[ParentNode],s.[IfLeafNode],s.[Material_Category],s.[Raw_Material_Category],@userID,getdate()); --更新接口表读取状态
update [ChwareXXXInterface].[dbo].[Tab_Materiel_Interface] set [If_Read]=1,ReadDT=GETDATE()where MaterielCode in (select MaterielCode from #tmpMateriel); --删除临时表
drop table #tmpMateriel;
select @nResult; --同步成功多少条数据
end
GO

总结:

通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

语法:
MERGE [INTO [schema .] table [t_alias] 
USING [schema .] { table | view | subquery } [t_alias] 
ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;

Merge Into 用法的更多相关文章

  1. SQL2008中Merge的用法

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  2. SQL中Merge的用法

    SQL中Merge的用法 Merge的用法 Merge可以完成以下功能: 1.  两个表之间数据的更新 2.  进行进销存更新库存 3.  进行表之间数据的复制 语法说明: 1.  在语句结束后一定要 ...

  3. SQL2008中Merge的用法(轉載)

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  4. SQL2008中Merge的用法(转)

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  5. pandas-16 pd.merge()的用法

    pandas-16 pd.merge()的用法 使用过sql语言的话,一定对join,left join, right join等非常熟悉,在pandas中,merge的作用也非常类似. 如:pd.m ...

  6. include的用法例子,以及include+merge的用法例子

    [include+LinearLayout]的使用例子 AndroidIncludeLayout.java package com.AndroidIncludeLayout; import andro ...

  7. oracle merge into用法

    转载:http://blog.163.com/duanpeng3@126/blog/static/885437352011724104741817/ 在 平时更新数据时,经常有这样一种更新,即将目标表 ...

  8. Oracle 的merge into 用法

    1.merge into的用途 Merge是一个非常有用的功能,与DB2中的merge into功能几乎一样,与Mysql里的insert into on duplicate key也很类似.MERG ...

  9. ORCAL Merge into用法总结

    简单的说就是,判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据. 有一个表T,有两个字段a.b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在 ...

  10. git rebase和git merge的用法

    http://softlab.sdut.edu.cn/blog/subaochen/2016/01/git-rebase%E5%92%8Cgit-merge%E7%9A%84%E7%94%A8%E6% ...

随机推荐

  1. SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)

    在产品表中,数据是具有一定层次结构的 1. 在Content相应的package下面右键点击Attribute View,新建Attribute View 填写相关信息,注意:我们所建的依然是标准视图 ...

  2. mac 终端下ssh 登录远程服务器不发输入中文

    转:https://segmentfault.com/q/1010000000150673 用Mac的iterm2 ssh连上去,终端显示中文乱码,也不能输入中文,然而本地终端可以显示和输入. 解决方 ...

  3. react使用map生成的元素,key的设定不对导致每次删除都删除最后一个

    假设 你的key设置为map中的索引,假设为0,1,2(原dom树),现在你用splice删除掉1,重新渲染时,还是会按map索引按顺序渲染为0,1(新dom树),由于react渲染机制是比较的key ...

  4. Python--变量作用域

    变量作用域: 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量. 全局变量所有作用域都可读,局部变量只能在本函数可读 函数在读取变量时,优先读取函数本身自有的局部变量,再去读全局 ...

  5. C3P0连接池参数详解

    <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> < ...

  6. C++中Map常见用法以及按照value排序

    今天做一个简单的算法题,居然用了1个小时,STL unordered_map用多了,没想到map这次派上了用场,这里记录一下: 算法题为 给一个字符串例如  abaaba,每连续两个字符组成一个子串 ...

  7. mac地址和ip地址要同时存在么?

    刚再整理笔记的时候,突然想到了一个问题,网络中为什么要同时存在mac地址和ip地址呢?那现在就来随便扯扯吧. 这个问题其实是可以分成两个问题的:Q1:如果只有mac地址,没有ip地址可以么? 众所周知 ...

  8. MVC模式学习笔记

    一.如何设计一个程序的结构,这是一门专门的学问,叫做“架构模式”(architectural pattern),属于编程的方法论. MVC模式就是架构模式的一种,我觉得它不仅适用于开发软件,也适用于其 ...

  9. js---DOM元素节点

    创建新的 HTML 元素如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素. 实例1: <!DOCTYPE html> <htm ...

  10. ZOJ 2476 Total Amount

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2476 Time Limit: 2 Seconds         ...