开发者社区> 杰克.陈> 正文

SQL Server 跨库同步数据

简介: 原文:SQL Server 跨库同步数据   最近有个需求是要跨库进行数据同步,两个数据库分布在两台物理计算机上,自动定期同步可以通过SQL Server代理作业来实现,但是前提是需要编写一个存储过程来实现同步逻辑处理。
+关注继续查看
原文:SQL Server 跨库同步数据

  最近有个需求是要跨库进行数据同步,两个数据库分布在两台物理计算机上,自动定期同步可以通过SQL Server代理作业来实现,但是前提是需要编写一个存储过程来实现同步逻辑处理。这里的存储过程用的不是opendatasource,而是用的链接服务器来实现的。存储过程创建在IP1:192.168.0.3服务器上,需要将视图v_custom的客户信息同步到IP2:192.168.0.10服务器上的t_custom表中。逻辑是如果不存在则插入,存在则更新字段。

    

 1 create PROCEDURE [dbo].[p_pm_项目平台客户批量同步到报销平台](
 2     @destserver nvarchar(50),
 3     @sourceserver nvarchar(50)
 4 )
 5 AS
 6 BEGIN
 7 
 8     SET NOCOUNT ON;
 9     --不存在则添加链接服务器,外部查询必须指明IP地址,例如 select * from [IP].[database].[dbo].[table]
10     if not exists (select * from sys.servers where server_id!=0  and data_source=@destserver)
11     begin
12         exec sp_addlinkedserver    @server=@destserver
13     end
14     if not exists (select * from sys.servers where server_id!=0  and data_source=@sourceserver)
15     begin
16         exec sp_addlinkedserver    @server=@sourceserver
17     end
18         begin try  
19         set xact_abort on
20         begin transaction 
21             --http://www.cnblogs.com/chnking/archive/2007/04/04/699891.html 
22                 INSERT INTO [192.168.0.10].[dbCRM].[dbo].[t_custom] (客户ID,
23                                 
24                                 客户名称,
25                                 客户简称,
26                                 输入码,
27                                 查询码,
28                                 地址,
29                                 录入登录名,
30                                 录入时间,
31                                 修改登录名,
32                                 修改时间,
33                                 审批状态ID,
34                                 审批状态名称,
35                                 是否审批结束,
36                                 审批操作时间,
37                                 项目管理客商编码,
38                                 序号)
39                 SELECT A.客户ID,A.客户名称,
40                                 A.客户简称,
41                                 dbo.fn_pm_GetPy(A.客户名称),
42                                 A.客户编号+','+A.客户名称+','+dbo.fn_pm_GetPy(A.客户名称)+','+A.客户简称+','+dbo.fn_pm_GetPy(A.客户简称),
43                                 A.地址,
44                                 'admin',
45                                 getdate(),
46                                 null,
47                                 null,
48                                 'D65F87A8-79C8-4D1C-812D-AE4591E056A8',
49                                 '已审批',
50                                 1,
51                                 A.审批操作时间,
52                                 A.项目管理客商编码,
53                                 0
54                 FROM   [dbPM].[dbo].[v_custom] A
55                 WHERE  A.客户ID NOT IN ( SELECT 客户ID FROM   [192.168.0.10].[dbCRM].[dbo].[t_custom]);
56             
57                                                     
58                                                                                     
59                 ----------------------------------存在更新-----------------------------------                                                                
60                 update   A  set  
61                             A.客户名称=B.客户名称,
62                             A.客户简称=B.客户简称,
63                             A.输入码=dbo.fn_pm_GetPy(B.客户名称),
64                             A.查询码=B.客户编号+','+B.客户名称+','+dbo.fn_pm_GetPy(B.客户名称)+','+B.客户简称+','+dbo.fn_pm_GetPy(B.客户简称),
65                             A.地址=B.地址,
66                             A.修改登录名='admin',
67                             A.修改时间=getdate(),
68                             A.项目管理客商编码 =B.项目管理客商编码
69                     from  [192.168.0.10].[dbCRM].[dbo].[t_custom] A,[dbPM].[dbo].[v_custom]  B 
70                     where A.客户ID=B.客户ID;
71             
72             
73             
74             commit transaction 
75         end try 
76         begin catch 
77             select ERROR_NUMBER() as errornumber,ERROR_MESSAGE() as errormsg,ERROR_LINE() as errorline
78             rollback transaction 
79         end catch
80 END

  如果没有正确配置,经常会出现 消息 7391,级别 16,状态 2,过程 xxxxx,第 XX 行 。无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。

  可以参照如下的配置:

 具体可以参看:http://www.cnblogs.com/chnking/archive/2007/04/04/699891.html 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Mysql全量数据同步Oracle步骤详解
0、题记 项目实战中我们会遇到数据库选型的问题,有时会需要将已有Mysql数据库中的数据库全部同步到Oracle数据库中。
97 0
TiDB 作为 MySQL Slave 实现实时数据同步
由于 TiDB 本身兼容绝大多数的 MySQL 语法,所以对于绝大多数业务来说,最安全的切换数据库方式就是将 TiDB 作为现有数据库的从库接在主 MySQL 库的后方,这样对业务方实现完全没有侵入性下使用 TiDB 对现有的业务进行备份,应对未来数据量或者并发量增长带来的单点故障风险,如需上线 TiDB,也只需要简单的将业务的主 MySQL 地址指向 TiDB 即可。 下面我们详细介绍了如何将 MySQL 的数据迁移到 TiDB,并将 TiDB 作为 MySQL 的 Slave 进行数据同步。 这里我们假定 MySQL 以及 TiDB 服务信息如下: +----------------
98 0
RandomUser – 生成随机用户 JSON 数据的 API
  RandomUser 是一个 API,它为您提供了一个或者一批随机生成的用户。这些用户可以在 Web 应用程序原型中用作占位符,将节省您创建自己的占位符信息的时间。您可以使用 AJAX 或其他方法来调用 RandomUser 获取随机用户数据。
1073 0
SQL Server - 使用 Merge 语句实现表数据之间的对比同步
原文:SQL Server - 使用 Merge 语句实现表数据之间的对比同步 表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等。
946 0
MySQL到Elasticsearch数据同步
MySQL数据同步Elasticsearch方案
4464 0
通过SQL Server 2008数据库复制实现数据库同步备份
原文 通过SQL Server 2008数据库复制实现数据库同步备份 SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份。这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主数据库服务器,备份服务器只在主服务器出现故障时投入使用。
1553 0
oracle数据库同步技术
在数据库同步过程中常用的同步方法: 说明: 1.建立数据库之间的关联请参考上一篇《给力--oracle 与sql同步》 2.数据库同步脚本如下: create or replace procedure prod_synchronized_data as --作者:chenab --时间:2011-01-10 --功能:原XXX系统中人事与卡信息同步到XXX管理系统中 be
1093 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载