最近有個(gè)需求是要跨庫進(jìn)行數(shù)據(jù)同步,兩個(gè)數(shù)據(jù)庫分布在兩臺物理計(jì)算機(jī)上,自動定期同步可以通過SQL Server代理作業(yè)來實(shí)現(xiàn),但是前提是需要編寫一個(gè)存儲過程來實(shí)現(xiàn)同步邏輯處理。這里的存儲過程用的不是opendatasource,而是用的鏈接服務(wù)器來實(shí)現(xiàn)的。存儲過程創(chuàng)建在IP1:192.168.0.3服務(wù)器上,需要將視圖v_custom的客戶信息同步到IP2:192.168.0.10服務(wù)器上的t_custom表中。邏輯是如果不存在則插入,存在則更新字段。
create PROCEDURE [dbo].[p_pm_項(xiàng)目平臺客戶批量同步到報(bào)銷平臺](
@destserver nvarchar(50),
@sourceserver nvarchar(50)
)
AS
BEGIN
SET NOCOUNT ON;
--不存在則添加鏈接服務(wù)器,外部查詢必須指明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,
客戶名稱,
客戶簡稱,
輸入碼,
查詢碼,
地址,
錄入登錄名,
錄入時(shí)間,
修改登錄名,
修改時(shí)間,
審批狀態(tài)ID,
審批狀態(tài)名稱,
是否審批結(jié)束,
審批操作時(shí)間,
項(xiàng)目管理客商編碼,
序號)
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.審批操作時(shí)間,
A.項(xiàng)目管理客商編碼,
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.修改時(shí)間=getdate(),
A.項(xiàng)目管理客商編碼 =B.項(xiàng)目管理客商編碼
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
如果沒有正確配置,經(jīng)常會出現(xiàn) 消息 7391,級別 16,狀態(tài) 2,過程 xxxxx,第 XX 行 。無法執(zhí)行該操作,因?yàn)殒溄臃?wù)器 "xxxxx" 的 OLE DB 訪問接口 "SQLNCLI" 無法啟動分布式事務(wù)。