从一个数据库的一张表同步数据到另外一个数据库的一张表,同步的数据不是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;

最新文章

  1. shiro-简介
  2. Android WebView 保存cache至External Storage
  3. C#接口显示实现在实际开发中的作用
  4. Nginx内置变量以及日志格式变量参数详解
  5. WPF,Silverlight与XAML读书笔记第四十四 - 外观效果之样式
  6. Spark SQL概念学习系列之Spark SQL 优化策略(五)
  7. 用SecureCRT来上传和下载文件
  8. 洛谷 [P3384] 树链剖分 模版
  9. class-map与policy-map 配置与qos模版
  10. SQL之NULL值的几种处理方式
  11. sqlmap常用渗透方法
  12. OC 与 js 界面JSBridge交互
  13. 『TensorFlow』批处理类
  14. ios 百度地图使用
  15. SQL Server登录方式
  16. activeMQ 持久化配置
  17. java 切图 判断图片是否是纯色/彩色图片
  18. Module 'null' not found异常解决办法
  19. wcf 远程服务器返回了意外响应: (413) Request Entity Too Large。
  20. java高级工程师(一)

热门文章

  1. Gs_Class.Gs_DataFunction数据操作类库20160225
  2. redis写shell与ssh免密码登陆
  3. 安装VMWare WorkStation 10 异常【 Failed to create the requested registry keyKey:Installer Error: 1021】
  4. div hover 特效 css样式
  5. Hibernate配置详细解释
  6. 树:BST、AVL、红黑树、B树、B+树
  7. iis服务器上面使用百度编辑器ueidtor提示“找不到临时文件”需要给window/temp修改权限
  8. Collector
  9. scala集合和高级函数操作
  10. 面向GC的Java编程(转)