最近有个需求是要跨库进行数据同步,两个数据库分布在两台物理计算机上,自动定期同步可以通过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. update A set
  59. A.客户名称=B.客户名称,
  60. A.客户简称=B.客户简称,
  61. A.输入码=dbo.fn_pm_GetPy(B.客户名称),
  62. A.查询码=B.客户编号+','+B.客户名称+','+dbo.fn_pm_GetPy(B.客户名称)+','+B.客户简称+','+dbo.fn_pm_GetPy(B.客户简称),
  63. A.地址=B.地址,
  64. A.修改登录名='admin',
  65. A.修改时间=getdate(),
  66. A.项目管理客商编码 =B.项目管理客商编码
  67. from [192.168.0.10].[dbCRM].[dbo].[t_custom] A,[dbPM].[dbo].[v_custom] B
  68. where A.客户ID=B.客户ID;
  69.  
  70. commit transaction
  71. end try
  72. begin catch
  73. select ERROR_NUMBER() as errornumber,ERROR_MESSAGE() as errormsg,ERROR_LINE() as errorline
  74. rollback transaction
  75. end catch
  76. END

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

  可以参照如下的配置:

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

SQL Server 跨库同步数据的更多相关文章

  1. SQL server 跨库插入数据

    1.INSERT INTO SELECT语句 语句形式为: Insert into Table2(field1,field2,...) select value1,value2,... from Ta ...

  2. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  3. SQL Server 跨库复制表方法小笔记

    insert into tableA (column1,column2.....) SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=127. ...

  4. SQL Server跨库跨服务器访问实现

    我们经常会遇到一个数据库要访问另一个数据库,或者一台服务器要访问另一台服务器里面的数据库. 那么这个如何实现的呢? 相信看完这篇文章你就懂了! 同一台服务器跨库访问实现 1. 首先创建两个数据库Cro ...

  5. SQL Server跨库查询

    方式一: 语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELEC ...

  6. sql server 跨库操作

    SELECT *FROM OPENDATASOURCE('SQLOLEDB','Data Source=sql服务器名;User ID=用户名;Password=密码;').PersonDb.dbo. ...

  7. SQL Server 跨服务器快速数据转移

    最近遇到一个问题,要将 a 服务器上的 A 库,迁移到 b 服务器上的 B 库,两个库的数据结构是一样的,但是数据库版本是 a 比 b 高,通过 sqlserver  还原这条路是走不通了,那难道除了 ...

  8. SQL Server 跨库查询

    1. 开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句: reconfigure reconfigure 2. 跨库查询操作 select * from ...

  9. sql server 跨数据库插入数据

    创建服务器的连接,创建好后可以存在服务器上,可以在不同位置重复使用,和系统函数类似 exec sp_addlinkedserver 'RemoteServer', '', 'SQLOLEDB ', ' ...

随机推荐

  1. JS原生第二篇 (帅哥)

    1.1 Javascript 作用  1.  网页特效 2. 用户交互 3. 表单验证 Js  就是可以用来控制   结构  和 样式 . 1.2  体验js   认识常用的三个输出语句.  都属于 ...

  2. 【WP开发】实现“摇一摇”功能

    尽管我的微信是每八个月登录一次,但我相信各位玩得比我多.微信有一个“摇一摇”功能,这个功能其实是利用了加速度传感器来实现的,这个传感器,我估计再低端的手机都会有的,这是严重基本的传感器. 重力加速度既 ...

  3. java多线程执行问题

    class Demo extends Thread{ public Demo(String name){ super(name); } public void run(){ for(int i=0; ...

  4. nodejs Error: request entity too large解决方案

    错误如图: 解决方案: app.js添加 var bodyParser = require('body-parser'); app.use(bodyParser.json({limit: '50mb' ...

  5. 使用ZeroClipboard解决跨浏览器复制到剪贴板的问题

    Zero Clipboard的实现原理Zero Clipboard 利用透明的Flash让其漂浮在复制按钮之上,这样其实点击的不是按钮而是 Flash ,这样将需要的内容传入Flash,再通过Flas ...

  6. Android基于mAppWidget实现手绘地图(十)–在放大前后执行一些操作

    为了在放大前后执行一些操作,你需要添加MapEventsListener 的实例到MapWidget,使用MapWidget.removeMapEventsListener移除该监听器. mapWid ...

  7. 各种排序学习归纳总结(Java)

    排序总结 根据<数据结构与算法分析——Java语言描述><INTRODUCTION TO JAVA PROGRAMMING>.维基及各技术博客知识点来总结的.  如果刚入门学习 ...

  8. storm坑之---同步问题

    最近在做一个监控系统,用来监控网站上各个业务功能的调用量以及处理时间,以便及时发现问题,及时处理.做这种实时统计处理系统,自然首先想到了storm,于是现学现用,自然遇到了一些坑,而且不少是网上也难以 ...

  9. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构

  10. 问题:Virtual Box如何复制镜像

    今天遇到的情况就是vagrant启动的默认Virtalbox镜像变了,大致可以处理的方法是 1 修改vagrant的默认virtalbox 2 重新在这个新的virtualbox中安装需要的软件 3 ...