dbPM 視圖 v_customdbCRM 表 t_customCREATE PROCEDURE [dbo].[p_pm_項目平台客戶批量同步到報銷平台]
@destserver NVARCHAR(50), -- 目標連結伺服器名稱
@sourceserver NVARCHAR(50) -- 來源連結伺服器名稱
AS
BEGIN
SET NOCOUNT ON;
-- 1. 動態確保連結伺服器存在
IF NOT EXISTS (SELECT * FROM sys.servers WHERE server_id != 0 AND data_source = @destserver)
EXEC sp_addlinkedserver @server = @destserver;
IF NOT EXISTS (SELECT * FROM sys.servers WHERE server_id != 0 AND data_source = @sourceserver)
EXEC sp_addlinkedserver @server = @sourceserver;
BEGIN TRY
SET XACT_ABORT ON;
BEGIN TRAN;
-- 2. INSERT 不存在的客戶
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]);
-- 3. UPDATE 已存在的客戶
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
JOIN [dbPM].[dbo].[v_custom] B ON A.客戶ID = B.客戶ID;
COMMIT TRAN;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS errornumber, ERROR_MESSAGE() AS errormsg, ERROR_LINE() AS errorline;
ROLLBACK TRAN;
END CATCH
END
GO
跨伺服器寫入需啟用 MSDTC,否則會報錯 7391「無法啟動分散式交易」。

MERGE 陳述式簡化 UPSERT 邏輯。CHANGE TRACKING / CDC + SSIS / Azure Data Factory 實現增量同步,減少全量掃描。