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

 create PROCEDURE [dbo].[p_pm_项目平台客户批量同步到报销平台](
@destserver nvarchar(50),
@sourceserver nvarchar(50)
)
AS
BEGIN SET NOCOUNT ON;
--不存在则添加链接服务器,外部查询必须指明IP地址,例如 select * from [IP].[database].[dbo].[table]
if not exists (select * from sys.servers where server_id!=0 and data_source=@destserver)
begin
exec sp_addlinkedserver @server=@destserver
end
if not exists (select * from sys.servers where server_id!=0 and data_source=@sourceserver)
begin
exec sp_addlinkedserver @server=@sourceserver
end
begin try
set xact_abort on
begin transaction
--http://www.cnblogs.com/chnking/archive/2007/04/04/699891.html
INSERT INTO [192.168.0.10].[dbCRM].[dbo].[t_custom] (客户ID, 客户名称,
客户简称,
输入码,
查询码,
地址,
录入登录名,
录入时间,
修改登录名,
修改时间,
审批状态ID,
审批状态名称,
是否审批结束,
审批操作时间,
项目管理客商编码,
序号)
SELECT A.客户ID,A.客户名称,
A.客户简称,
dbo.fn_pm_GetPy(A.客户名称),
A.客户编号+','+A.客户名称+','+dbo.fn_pm_GetPy(A.客户名称)+','+A.客户简称+','+dbo.fn_pm_GetPy(A.客户简称),
A.地址,
'admin',
getdate(),
null,
null,
'D65F87A8-79C8-4D1C-812D-AE4591E056A8',
'已审批',
1,
A.审批操作时间,
A.项目管理客商编码,
0
FROM [dbPM].[dbo].[v_custom] A
WHERE A.客户ID NOT IN ( SELECT 客户ID FROM [192.168.0.10].[dbCRM].[dbo].[t_custom]); ----------------------------------存在更新-----------------------------------
update A set
A.客户名称=B.客户名称,
A.客户简称=B.客户简称,
A.输入码=dbo.fn_pm_GetPy(B.客户名称),
A.查询码=B.客户编号+','+B.客户名称+','+dbo.fn_pm_GetPy(B.客户名称)+','+B.客户简称+','+dbo.fn_pm_GetPy(B.客户简称),
A.地址=B.地址,
A.修改登录名='admin',
A.修改时间=getdate(),
A.项目管理客商编码 =B.项目管理客商编码
from [192.168.0.10].[dbCRM].[dbo].[t_custom] A,[dbPM].[dbo].[v_custom] B
where A.客户ID=B.客户ID; commit transaction
end try
begin catch
select ERROR_NUMBER() as errornumber,ERROR_MESSAGE() as errormsg,ERROR_LINE() as errorline
rollback transaction
end catch
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. Enerprise Solution Main 启动方法源代码

    .NET 系统以Main方法作为应用程序的启动入口点,Enterprise Solution的启动程序源代码如下: [STAThread] static void Main() { string MA ...

  2. 【WP开发】手电筒

    或许很多人都想到,可以利用手机上摄像头的闪光灯做手电筒,当然,有利必有害,每次使用的时间不要过长,几分钟一般不会有什么问题,如果时间太长,难保会有损伤. 以往的方案是调用视频录制功能来开始录制视频,同 ...

  3. ELCImagePickerController 的集成

    1,  将文件夹ELCImagePicker拷贝到工程中 2,添加系统库AssetsLibrary.framework 3,  添加系统库MobileCoreServices 4,在头文件中加入引用# ...

  4. 深入理解PHP内核(三)概览-SAPI概述

    本文链接:http://www.orlion.ml/234/ 1.在PHP生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现.这些内置实现的物理位置在PHP源码的SAPI目录.这个目录存 ...

  5. hibernate(一)第一个例子

    一.创建一个java project名为HibernateDemo1 然后导入hibernate包,eclipse中具体操作: 点击菜单栏windows->preferences->jav ...

  6. struts2DMI(动态方法调用)

    struts2动态方法调用共有三种方式: 1.通过action元素的method属性指定访问该action时运行的方法 <package name="action" exte ...

  7. PHP函数处理函数实例详解

    1. call_user_func和call_user_func_array:  以上两个函数以不同的参数形式调用回调函数.见如下示例: <?php class AnotherTestClass ...

  8. 数据库备份与还原SQL代码

    --备份数据库 --必须先创建Backup文件夹 ) SET @name = 'D:\Backup\DingHanECard_V2_ZQGDJ_' ), ) + '.bak' BACKUP DATAB ...

  9. Office PPT保持提示无法保存Gill Sans 等非TrueType字体

    升级office到最新版了 我有一天在做PPT,保存文件后提示保存:无法保存Gill Sans 等非TrueType字体 我知道PPT可以替换字体.于是使用替换字体功能,但是提示非TrueType不能 ...

  10. Elasticsearch Javascript API增删改查

    查询 根据索引.类型.id进行查询: client.get({ index:'myindex', type:'mytype', id:1 },function(error, response){// ...