最近有個需求是要跨庫進行數據同步,兩個數據庫分布在兩台物理計算機上,自動定期同步可以通過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 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" 無法啟動分布式事務。
可以參照如下的配置:
以上就是SQL Server 跨庫同步數據的實現方法,希望對大家的學習有所幫助。