跨链接服务器数据同步:实现存在则更新/跳过、不存在则插入
链接服务器数据同步:存在则跳过/更新,不存在则插入
针对你的需求,这里提供两种常用实现方案,分别对应「跳过已存在行」和「存在则更新」的场景:
场景1:仅插入目标表中不存在的新行
如果只需要跳过COLUMREM1+COLUMREM2组合重复的数据,直接插入新行,可使用以下两种写法:
方法1:用 NOT EXISTS 过滤已存在数据
INSERT INTO [REMOTEPC\SQL].[REMOTEDB].[dbo].REMOTETABLE (COLUMREM1, COLUMREM2, COLUMREM3, COLUMREM4, COLUMREM5, COLUMREM6, COLUMREM7) SELECT COLUMLOC1, COLUMLOC2, COLUMLOC3, COLUMLOC4, COLUMLOC5, COLUMLOC6, COLUMLOC7 FROM LOCDB.dbo.LOCALTABLE AS local_t WHERE NOT EXISTS ( SELECT 1 FROM [REMOTEPC\SQL].[REMOTEDB].[dbo].REMOTETABLE AS remote_t WHERE remote_t.COLUMREM1 = local_t.COLUMLOC1 AND remote_t.COLUMREM2 = local_t.COLUMLOC2 )
方法2:用 LEFT JOIN 筛选无匹配的行
INSERT INTO [REMOTEPC\SQL].[REMOTEDB].[dbo].REMOTETABLE (COLUMREM1, COLUMREM2, COLUMREM3, COLUMREM4, COLUMREM5, COLUMREM6, COLUMREM7) SELECT local_t.COLUMLOC1, local_t.COLUMLOC2, local_t.COLUMLOC3, local_t.COLUMLOC4, local_t.COLUMLOC5, local_t.COLUMLOC6, local_t.COLUMLOC7 FROM LOCDB.dbo.LOCALTABLE AS local_t LEFT JOIN [REMOTEPC\SQL].[REMOTEDB].[dbo].REMOTETABLE AS remote_t ON remote_t.COLUMREM1 = local_t.COLUMLOC1 AND remote_t.COLUMREM2 = local_t.COLUMLOC2 WHERE remote_t.COLUMREM1 IS NULL
场景2:存在则更新,不存在则插入(UPSERT)
如果需要对已存在的行执行更新,对不存在的行执行插入,推荐使用SQL Server的MERGE语句,这是最直接的UPSERT实现方式:
MERGE INTO [REMOTEPC\SQL].[REMOTEDB].[dbo].REMOTETABLE AS target USING LOCDB.dbo.LOCALTABLE AS source ON target.COLUMREM1 = source.COLUMLOC1 AND target.COLUMREM2 = source.COLUMLOC2 WHEN MATCHED THEN UPDATE SET COLUMREM3 = source.COLUMLOC3, COLUMREM4 = source.COLUMLOC4, COLUMREM5 = source.COLUMLOC5, COLUMREM6 = source.COLUMLOC6, COLUMREM7 = source.COLUMLOC7 WHEN NOT MATCHED THEN INSERT (COLUMREM1, COLUMREM2, COLUMREM3, COLUMREM4, COLUMREM5, COLUMREM6, COLUMREM7) VALUES (source.COLUMLOC1, source.COLUMLOC2, source.COLUMLOC3, source.COLUMLOC4, source.COLUMLOC5, source.COLUMLOC6, source.COLUMLOC7);
注意事项
- 为保证性能并避免重复数据,建议在目标表的
COLUMREM1和COLUMREM2上创建唯一复合索引:CREATE UNIQUE NONCLUSTERED INDEX IX_REMOTETABLE_COLUMREM1_COLUMREM2 ON [REMOTEDB].[dbo].REMOTETABLE (COLUMREM1, COLUMREM2); - 确保链接服务器的登录账号拥有目标表的
INSERT(或UPDATE,若用UPSERT)权限。 - 若同步数据量较大,建议分批处理,避免长时间锁表或性能瓶颈。
内容的提问来源于stack exchange,提问作者Karter Kor
相关产品推荐
相关产品推荐

