標籤:
最近有個需求是要跨庫進行資料同步,兩個資料庫分布在兩台實體電腦上,自動定期同步可以通過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 begin12 exec sp_addlinkedserver @server=@destserver13 end14 if not exists (select * from sys.servers where server_id!=0 and data_source=@sourceserver)15 begin16 exec sp_addlinkedserver @server=@sourceserver17 end18 begin try 19 set xact_abort on20 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 054 FROM [dbPM].[dbo].[v_custom] A55 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 errorline78 rollback transaction 79 end catch80 END
如果沒有正確配置,經常會出現 訊息 7391,層級 16,狀態 2,過程 xxxxx,第 XX 行 。無法執行該操作,因為連結的伺服器 "xxxxx" 的 OLE DB 提供者 "SQLNCLI" 無法啟動分散式交易。
可以參照如下的配置:
具體可以參看:http://www.cnblogs.com/chnking/archive/2007/04/04/699891.html
SQL Server 跨庫同步資料