SQL Server 跨庫(kù)同步數(shù)據(jù)
最近有個(gè)需求是要跨庫(kù)進(jìn)行數(shù)據(jù)同步,兩個(gè)數(shù)據(jù)庫(kù)分布在兩臺(tái)物理計(jì)算機(jī)上,自動(dòng)定期同步可以通過(guò)SQL Server代理作業(yè)來(lái)實(shí)現(xiàn),但是前提是需要編寫(xiě)一個(gè)存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)同步邏輯處理。這里的存儲(chǔ)過(guò)程用的不是opendatasource,而是用的鏈接服務(wù)器來(lái)實(shí)現(xiàn)的。存儲(chǔ)過(guò)程創(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)目平臺(tái)客戶批量同步到報(bào)銷(xiāo)平臺(tái)](
@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,
客戶名稱(chēng),
客戶簡(jiǎn)稱(chēng),
輸入碼,
查詢碼,
地址,
錄入登錄名,
錄入時(shí)間,
修改登錄名,
修改時(shí)間,
審批狀態(tài)ID,
審批狀態(tài)名稱(chēng),
是否審批結(jié)束,
審批操作時(shí)間,
項(xiàng)目管理客商編碼,
序號(hào))
SELECT A.客戶ID,A.客戶名稱(chēng),
A.客戶簡(jiǎn)稱(chēng),
dbo.fn_pm_GetPy(A.客戶名稱(chēng)),
A.客戶編號(hào)+','+A.客戶名稱(chēng)+','+dbo.fn_pm_GetPy(A.客戶名稱(chēng))+','+A.客戶簡(jiǎn)稱(chēng)+','+dbo.fn_pm_GetPy(A.客戶簡(jiǎn)稱(chēng)),
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.客戶名稱(chēng)=B.客戶名稱(chēng),
A.客戶簡(jiǎn)稱(chēng)=B.客戶簡(jiǎn)稱(chēng),
A.輸入碼=dbo.fn_pm_GetPy(B.客戶名稱(chēng)),
A.查詢碼=B.客戶編號(hào)+','+B.客戶名稱(chēng)+','+dbo.fn_pm_GetPy(B.客戶名稱(chēng))+','+B.客戶簡(jiǎn)稱(chēng)+','+dbo.fn_pm_GetPy(B.客戶簡(jiǎn)稱(chēng)),
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
如果沒(méi)有正確配置,經(jīng)常會(huì)出現(xiàn) 消息 7391,級(jí)別 16,狀態(tài) 2,過(guò)程 xxxxx,第 XX 行 。無(wú)法執(zhí)行該操作,因?yàn)殒溄臃?wù)器 "xxxxx" 的 OLE DB 訪問(wèn)接口 "SQLNCLI" 無(wú)法啟動(dòng)分布式事務(wù)。
可以參照如下的配置:

以上就是SQL Server 跨庫(kù)同步數(shù)據(jù)的實(shí)現(xiàn)方法,希望對(duì)大家的學(xué)習(xí)有所幫助。
- SQL Server實(shí)時(shí)同步更新遠(yuǎn)程數(shù)據(jù)庫(kù)遇到的問(wèn)題小結(jié)
- SqlServer2008 數(shù)據(jù)庫(kù)同步的兩種方式(發(fā)布、訂閱使用方法)
- 通過(guò)SQL Server 2008數(shù)據(jù)庫(kù)復(fù)制實(shí)現(xiàn)數(shù)據(jù)庫(kù)同步備份
- SQL Server 2005 鏡像構(gòu)建手冊(cè)(sql2005數(shù)據(jù)庫(kù)同步鏡像方案)
- 深入SqlServer2008 數(shù)據(jù)庫(kù)同步的兩種方式(Sql JOB)的分析介紹
- 使用Sqlserver事務(wù)發(fā)布實(shí)現(xiàn)數(shù)據(jù)同步(sql2008)
- SQL Server兩表數(shù)據(jù)同步的多種方法詳解
相關(guān)文章
sqlserver附加.mdf權(quán)限問(wèn)題解決
sqlserver附加.mdf權(quán)限問(wèn)題解決,需要的朋友可以參考一下2013-03-03
SQL?Server數(shù)據(jù)庫(kù)創(chuàng)建表及其約束條件的操作方法
這篇文章主要介紹了SQL?Server?創(chuàng)建表及其約束條件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
sql中循環(huán)處理當(dāng)前行數(shù)據(jù)和上一行數(shù)據(jù)相加減
曾經(jīng),sql中循環(huán)處理當(dāng)前行數(shù)據(jù)和上一行數(shù)據(jù)浪費(fèi)了我不少時(shí)間,學(xué)會(huì)后才發(fā)現(xiàn)如此容易,其實(shí)學(xué)問(wèn)就是如此,難者不會(huì),會(huì)者不難。2014-08-08
sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
這篇文章主要介紹了sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
MSSQL 將截?cái)嘧址蚨M(jìn)制數(shù)據(jù)問(wèn)題的解決方法
主要原因就是給某個(gè)字段賦值時(shí),內(nèi)容大于字段的長(zhǎng)度或類(lèi)型不符造成的2010-10-10
SQL Server誤區(qū)30日談 第15天 CheckPoint只會(huì)將已提交的事務(wù)寫(xiě)入磁盤(pán)
這個(gè)誤區(qū)是由于太多人對(duì)日志和恢復(fù)系統(tǒng)缺少全面的了解而存在已久。CheckPoint會(huì)將自上次CheckPoint以來(lái)所有在內(nèi)存中改變的頁(yè)寫(xiě)回磁盤(pán)(譯者注:也就是臟頁(yè)),或是在上一個(gè)CheckPoint讀入內(nèi)存的臟頁(yè)寫(xiě)入磁盤(pán)2013-01-01
Sql Server的一些知識(shí)點(diǎn)定義總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Sql Server的一些知識(shí)點(diǎn)定義文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
case?when?then?else?end語(yǔ)句的用法(附demo)
本文主要介紹了case?when?then?else?end語(yǔ)句的用法,主要介紹了兩種格式,簡(jiǎn)單case函數(shù)和case搜索函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

