☰
K3 Wise基础资料同步SQL:内码重建与映射表实战指南
2026/10/9 13:04:56 网站建设 项目流程

简介:面向金蝶K3 Wise系统的实施与运维人员,这套SQL脚本提供了一套基础资料同步方案,覆盖职员、物料、客户、计量单位、供应商、仓库等核心主数据及其类别的同步逻辑,用于解决多账套或异构系统间基础资料维护不一致、重复录入等问题。压缩包内共15个文件,全部为SQL脚本,整体仅30KB,脚本按业务对象分类,便于按需取用。目前已有1348人学习下载。通过阅读和执行这些存储过程,可以快速理解K3 Wise基础资料表间映射关系与同步思路,并在此基础上按企业规则调整字段映射、编码规则或增量更新条件,减少手工整理数据的时间成本。适合有一定K3 SQL基础、希望提升数据维护效率的开发和维护人员参考。

1. K3 Wise 基础资料同步 SQL:先讲清楚为什么绕不开内码与映射表

跨账套同步物料、客户、供应商、部门,是 K3 Wise 实施、运维和二次开发里最容易踩坑的环节。界面逐条录入太慢,标准工具导出导入又常常因为 FItemID 内码不一致,导致同步过去的资料在单据上选不到、编号重复、引用断链。这套基础资料同步 SQL 语句的价值,在于直接从数据库层面把源账套的基础资料抽出来,按新账套的内码规则重建 ID,再连同明细行一起写入目标账套。它适合正在做账套合并、多账套统一编码的从业者,也适合交付现场需要在两个库之间搬运主数据的场景。下面按“表结构 → 同步骨架 → 顺序依赖 → 避坑 → 验证”的顺序展开,每步都能直接套用。

2. 先看懂表结构:t_Item、t_ICItem 与扩展表的依赖关系

2.1 四张核心表的角色,先分清再动手

初次打开 K3 Wise 数据库的人,最容易懵的地方是:物料到底存在哪张表?物料在 t_ICItem 里,但物料的基础资料行又同时出现在 t_Item 里;客户、供应商、部门、职员这些没有独立主档表的资料,则只以 t_Item 里的一个类别行存在。

换句话说,t_Item 是一张“所有基础资料统一入口”表,FItemClassID 决定了这一行是物料、客户还是供应商;t_ICItem 只存放物料特有的属性,比如默认单位、物料属性、计价方式。真正决定列表顺序和层级关系的是 t_ItemDetail,FDetailID 在同一类别内承担排序功能。最后一个关键表是 t_Identity,它负责给前几张表发内码号。搞清楚这四张表的职责,后面写同步 SQL 才不会把数据插到错的位置。

表名职责同步时的作用
t_Item所有基础资料的统一主档行,FItemClassID 区分类型必须插入
t_ItemDetail明细与排序行,FDetailID 控制展示顺序必须按类别重建
t_ICItem物料属性主档,FItemID 与 t_Item 共用仅物料要插入
t_Identity内码分配池,FMaxID 决定下一个可用 ID插入后必须回写
t_ItemClass类别字典,确认每个 FItemClassID 的含义用于同步前核对

上面这张清单是常见版本的结构,个别版本把类别字典放在 t_BaseClass。不确定时先跑下面这句 SQL 探路,比翻文档快得多:

-- 在当前数据库里找出类别字典表,确认 FItemClassID 的真实含义 SELECT name FROM sys.tables WHERE name LIKE '%ItemClass%' OR name LIKE '%BaseClass%';

逻辑说明:这句的作用是探测当前账套中基础资料类别表的名字,因为不同版本的表名存在差异。执行结果里如果出现 t_ItemClass,就是用这张表;如果出现 t_BaseClass,则同步前所有的类别查询都换成它。参数说明:LIKE 后面的百分号是模糊匹配,如果你已经确认了表名,可以直接执行SELECT * FROM t_ItemClass,效果等价。

我一般会在同步脚本开头留一个SELECT FItemClassID, FName FROM t_ItemClass ORDER BY FItemClassID的输出,先肉眼确认物料、客户、供应商分别对应哪个数字。别靠记忆,靠查询。

2.2 t_Identity:整个内码分配的核心

K3 Wise 的基础资料主键不是 SQL Server 自增列,而是由程序统一从 t_Identity 里取号,取完后再把 FMaxID 加一写回。很多第一次写同步脚本的人会直接取源账套的 FItemID 往目标账套插,结果插入后发现要么主键撞了,要么界面上新增物料时系统报错,这就是没搞懂 ID 分配机制。

-- 目标账套:查看基础资料 ID 池的当前水位 SELECT FKey, FMaxID FROM t_Identity WHERE FKey IN ('t_Item', 't_ICItem', 't_ItemDetail') ORDER BY FKey;

逻辑说明:t_Identity 存的是每个表下一次要分配的 ID。跨账套同步时必须模拟这个动作:先从 FMaxID+1 取出新 ID,插入数据后把 FMaxID 更新为刚才取的 ID。不更新的话,同步完成后目标账套用户在界面上新建一条物料,系统可能重复使用已被你插入的 ID,导致主键冲突、单据串数据。参数说明:FKey 就是表名;FMaxID 是已发放的最大 ID。查询结果里如果 t_Item 的 FMaxID 远大于 t_ICItem 的 FMaxID,说明两个不是同一个池子,同步时要分别取号。

这里有个容易看走眼的细节:物料在 t_Item 中的行与 t_ICItem 中的行共享同一个 FItemID,所以对物料来说,两次取号必须取同一个值;而客户、供应商这些只在 t_Item 中存在的资料,只取一次号。这个差异是很多同步脚本写错之后,出现“物料在物料列表里看得到,但基础资料统一列表里没有”的根源。

2.3 单据引用链与同步顺序推导

基础资料同步不只是 insert 几张表。想象一下源账套里有一张销售订单,订单分录表的物料字段引用的是源账套的 FItemID=66;同步到目标账套后新 ID 变成了 88,订单分录仍写着 66,就会指向目标账套里另一个物料。所以一套完整的同步方案必须带着映射表走,映射表的设计直接影响后续单据迁移是否安全。

引用链从短到长排序如下:

  • t_MeasureUnitGroup(计量单位组)→ t_MeasureUnit(计量单位)→ t_ICItem.FUnitID
  • t_Item(类别行)→ 各单据头、分录里的往来单位、部门、业务员字段
  • t_ICItem(物料属性)→ 所有物料类单据分录的 FItemID

这就解释了为什么同步顺序一定是:先单位组,再单位,再物料和客户,最后才是业务单据。如果只同步基础资料不同步单据,映射表也要保存下来,等日后单据迁移时按新 ID 替换。

3. 物料同步主流程:从源账套抽数、改内码、落目标账套的 SQL 骨架

3.1 同步前准备:建立新老 ID 映射表

写跨账套脚本前,一定要先建一张映射表。建议放在目标账套里,并建成正式表而不是临时表,因为脚本中途失败还要靠它做断点续跑。

-- 目标账套:创建映射表,记录源账套 ID 与目标账套 ID 的对应关系 IF OBJECT_ID('dbo.Map_ItemID') IS NOT NULL DROP TABLE dbo.Map_ItemID; CREATE TABLE dbo.Map_ItemID( SrcFItemID INT NOT NULL, -- 源账套里的 FItemID DstFItemID INT NOT NULL, -- 目标账套里的 FItemID FNumber NVARCHAR(80) NOT NULL, -- 基础资料编码 FName NVARCHAR(255) NOT NULL, -- 基础资料名称 FItemClassID INT NOT NULL, -- 类别 ID SyncTime DATETIME DEFAULT GETDATE() -- 同步时间 );

逻辑说明:SrcFItemID 用于关联源账套里的旧档案,DstFItemID 是目标账套里的新 ID。以后无论是同步单据、同步扩展表,还是排查数据问题,都是拿这张表做翻译。参数说明:FItemClassID 必须跟源账套保持一致,否则后续按类别过滤时会漏数据;FNumber 建议加上唯一索引,这是排查重复编码的关键字段。

接下来从源账套抓取需要同步的物料清单,过滤已删除记录是重点:

-- 源账套:抓取物料类基础资料的待同步清单 -- 示例 FItemClassID=20,请以 2.1 查到的类别字典为准 SELECT t.FItemID, t.FNumber, t.FName, t.FItemClassID INTO #SrcList FROM [AIS源账套].[dbo].[t_Item] t WHERE t.FItemClassID = 20 AND t.FDeleted = 0; -- 逻辑删除标记,老版本可能是 FFlag=0

逻辑说明:INTO #SrcList把结果存进临时表,避免反复扫描源账套大表。FDeleted=0 这个过滤条件一定要加,否则会把源账套里已经逻辑删除的旧物料也搬过去,导致目标账套编码重复。参数说明:[AIS源账套] 替换成你的源账套实际库名,如果两个库在同一台服务器上,直接写库名即可;如果跨服务器,需要先建链接服务器,再改成[源服务器].[AIS源账套].[dbo].[t_Item]这种四段式写法。

3.2 事务内插入 t_Item、t_ItemDetail、t_ICItem 三张表

物料同步的核心动作是同时写三张表,并且三张表要在一个事务里,任何一张失败都要整体回滚。下面这个游标脚本是完整骨架:

DECLARE @SrcFItemID INT, @FNumber NVARCHAR(80), @FName NVARCHAR(255), @FItemClassID INT; DECLARE @DstFItemID INT, @DstFDetailID INT; SET NOCOUNT ON; BEGIN TRANSACTION SyncItem; BEGIN TRY DECLARE cur_item CURSOR FOR SELECT SrcFItemID, FNumber, FName, FItemClassID FROM #SrcList ORDER BY FNumber; OPEN cur_item; FETCH NEXT FROM cur_item INTO @SrcFItemID, @FNumber, @FName, @FItemClassID; WHILE @@FETCH_STATUS = 0 BEGIN -- 从 ID 池取基础资料 ID SELECT @DstFItemID = FMaxID + 1 FROM t_Identity WHERE FKey = 't_Item'; -- 从 ID 池取明细排序 ID SELECT @DstFDetailID = FMaxID + 1 FROM t_Identity WHERE FKey = 't_ItemDetail'; -- 写入基础资料统一主档行 INSERT INTO t_Item(FItemID, FItemClassID, FNumber, FName) VALUES(@DstFItemID, @FItemClassID, @FNumber, @FName); -- 写入明细排序行 INSERT INTO t_ItemDetail(FItemID, FDetailID, FItemClassID, FNumber, FName) VALUES(@DstFItemID, @DstFDetailID, @FItemClassID, @FNumber, @FName); -- 写入物料专属表,ID 与 t_Item 共用 INSERT INTO t_ICItem(FItemID, FItemClassID, FNumber, FName, FErpClsID, FUnitID, FDeleted) SELECT @DstFItemID, @FItemClassID, i.FNumber, i.FName, i.FErpClsID, i.FUnitID, 0 FROM [AIS源账套].[dbo].[t_ICItem] i WHERE i.FItemID = @SrcFItemID; -- 回写 ID 池 UPDATE t_Identity SET FMaxID = @DstFItemID WHERE FKey = 't_Item'; UPDATE t_Identity SET FMaxID = @DstFDetailID WHERE FKey = 't_ItemDetail'; -- 记录映射关系 INSERT INTO dbo.Map_ItemID(SrcFItemID, DstFItemID, FNumber, FName, FItemClassID) VALUES(@SrcFItemID, @DstFItemID, @FNumber, @FName, @FItemClassID); FETCH NEXT FROM cur_item INTO @SrcFItemID, @FNumber, @FName, @FItemClassID; END; CLOSE cur_item; DEALLOCATE cur_item; COMMIT TRANSACTION SyncItem; END TRY BEGIN CATCH ROLLBACK TRANSACTION SyncItem; IF CURSOR_STATUS('global', 'cur_item') >= 0 BEGIN CLOSE cur_item; DEALLOCATE cur_item; END; SELECT ERROR_NUMBER() AS ErrNo, ERROR_MESSAGE() AS ErrMsg; END CATCH;

逻辑说明:游标每循环一次处理一条物料,先取两个 ID,再依次插入三张表,最后回写 ID 池并记录映射。这里最关键的是第 3 步:源账套的 FUnitID 是源账套里的单位 ID,直接搬过去十有八九会指错单位,正确做法是经过单位映射表转换,详见第 4 章。参数说明:FErpClsID 是物料属性(自制、外购、委外等),与源账套保持一致即可;FUnitID 表示物料默认计量单位,这里先保留原值,后续替换。

注意:如果目标账套对 t_Item 建了触发器,批量插入可能会触发额外的校验或日志写入。遇到这种情况先检查目标账套里有没有同名触发器,必要时在同步期间临时禁用,同步完再恢复。

3.3 批量游标的执行效率与断点续跑

游标在几千条物料上通常能跑完,但如果账套里有几十万条物料,建议按 FNumber 前缀分批跑,每批 1000 条,批间停顿,避免长时间锁表。保持事务不变,只是游标查询范围加上WHERE FNumber LIKE '前缀%'。

断点续跑是现场最实用的功能。脚本执行到中途报错,回滚之后重新跑,已经写入映射表的源 ID 可以直接跳过:

-- 断点续跑:已经写入映射表的源 ID,第二次执行时跳过 IF NOT EXISTS (SELECT 1 FROM dbo.Map_ItemID WHERE SrcFItemID = @SrcFItemID) BEGIN -- 插入三张表与回写 ID 池,代码同 3.2 END;

逻辑说明:映射表在这里扮演了检查点角色。第一次跑成功的不会重插,没跑到的继续插入,而不是把目标账套清空重来。这个习惯能省下大量返工时间,尤其是同步到一半发现源账套编码规则变了的情况。

4. 计量单位与核算项目:同步顺序错了整批白干

4.1 计量单位组与计量单位:同步物料前必须先在目标账套存在

物料主档里的 FUnitID 指向计量单位,计量单位又从属于计量单位组。如果单位没同步而物料先进来,物料主档的单位要么是空的,要么指向一个根本不存在的 ID。这个问题的隐蔽性在于:界面打开物料时不一定立刻报错,但做单选单位时就是空白或者乱码。

单位组和单位的同步方式与物料一致,ID 也走 t_Identity 取号。先建两张映射表,再按“组 → 单位”的顺序插入:

-- 目标账套:单位组映射表 IF OBJECT_ID('dbo.Map_UnitGroupID') IS NOT NULL DROP TABLE dbo.Map_UnitGroupID; CREATE TABLE dbo.Map_UnitGroupID( SrcFGroupID INT, DstFGroupID INT, FName NVARCHAR(64) ); -- 目标账套:单位映射表 IF OBJECT_ID('dbo.Map_UnitID') IS NOT NULL DROP TABLE dbo.Map_UnitID; CREATE TABLE dbo.Map_UnitID( SrcFUnitID INT, DstFUnitID INT, SrcFGroupID INT, DstFGroupID INT, FName NVARCHAR(64) );

逻辑说明:单位组先同步,单位后同步,映射表里不仅要记录单位本身的 ID 对照,还要记录单位组的 ID 对照,因为单位表中的 FGroupID 也要从源账套值替换成目标账套值。参数说明:单位组表常见名称为 t_MeasureUnitGroup,单位表常见名称为 t_MeasureUnit,FGroupID 在两张表里都出现。

有了单位映射表之后,把 3.2 里物料第三段的插入语句改成带替换的形式:

-- 物料同步第 3 步改进版:用单位映射替换 FUnitID INSERT INTO t_ICItem(FItemID, FItemClassID, FNumber, FName, FErpClsID, FUnitID, FDeleted) SELECT @DstFItemID, @FItemClassID, i.FNumber, i.FName, i.FErpClsID, ISNULL(u.DstFUnitID, i.FUnitID), 0 FROM [AIS源账套].[dbo].[t_ICItem] i LEFT JOIN dbo.Map_UnitID u ON i.FUnitID = u.SrcFUnitID WHERE i.FItemID = @SrcFItemID;

逻辑说明:LEFT JOIN 保证源账套里每一行物料都能读出来,ISNULL 的意思是如果单位映射没找到,就保留源账套原 ID。这是最后的兜底,不建议依赖它,因为兜底不报错会让问题被掩盖。参数说明:u.DstFUnitID 是单位映射后的新 ID,i.FUnitID 是源账套旧 ID;如果单位确实还没同步,应该先回去补单位,而不是靠 ISNULL 硬扛。

4.2 客户与供应商:主档行和扩展表共用同一个新 ID

客户、供应商、部门、职员这类核算项目,主档在 t_Item,但客户和供应商还有各自的扩展表。以供应商为例,常见扩展表是 t_Supplier,它的主键 FSupplierID 与 t_Item 的 FItemID 是同一个值,同步时扩展表也要用同一个 @DstFItemID:

-- 目标账套:以供应商为例,扩展表使用与 t_Item 相同的 @DstFItemID INSERT INTO t_Supplier(FSupplierID, FNumber, FName, FContact, FPhone) VALUES(@DstFItemID, @FNumber, @FName, '', ''); -- 同时写入 t_ItemDetail 明细排序行 INSERT INTO t_ItemDetail(FItemID, FDetailID, FItemClassID, FNumber, FName) SELECT @DstFItemID, FMaxID + 1, @FItemClassID, @FNumber, @FName FROM t_Identity WHERE FKey = 't_ItemDetail';

逻辑说明:供应商的主档行在 t_Item,扩展信息行在 t_Supplier,两边用同一个 ID 串起来。只插 t_Supplier 不插 t_Item,界面上这个供应商根本不会出现;只插 t_Item 不插 t_Supplier,打开供应商详情就是空的。参数说明:FContact、FPhone 属于常用联系人字段,不同版本字段有差异,执行前先用SELECT TOP 1 * FROM t_Supplier确认一下扩展表结构。FDetailID 的取号方式仍然走 t_Identity,确保同一类别内排序号不重复。

4.3 一个顺序表串起全部依赖

同步顺序错了,最常见的结果就是前面插入成功、后面界面看得到但打不开。下面这张表是我每次做账套间同步前都会打印出来的清单:

步骤同步对象关键表顺序原因
1计量单位组t_MeasureUnitGroup单位表中的 FGroupID 引用它
2计量单位t_MeasureUnit物料 FUnitID 引用它
3物料t_Item、t_ICItem、t_ItemDetail所有物料类单据引用物料 ID
4供应商t_Item、t_Supplier采购单据引用供应商 ID
5客户t_Item、客户扩展表销售单据引用客户 ID
6部门、职员t_Item单据制单人、审核人引用
7业务单据各单头、分录表必须用映射表替换旧 ID

跳过前两步直接同步物料,物料建出来单位控件是空的;跳过供应商扩展表,采购订单选了供应商但详情打不开。这类问题排查起来最耗时间,因为插入语句本身没报错,只能通过界面上逐个点开检查才能发现。养成按顺序执行的习惯,比任何排查技巧都管用。

5. 避坑排查:五个在实施现场反复出现的同步翻车点

5.1 物料“同步成功”但单据上选不到:FItemID 与 FDetailID 断链

现象:用 SQL 查询确认物料已经插入 t_ICItem,目标账套界面上也能看到物料列表,但到单据里做分录时,物料选择界面搜索不到这条记录。

原因:物料选择界面默认按 t_ItemDetail.FDetailID 过滤和排序,如果 FDetailID 没有按类别正确分配,或者直接给了 0 和 NULL,界面会把这条物料当成无效记录过滤掉。另一个常见原因是没有往 t_ItemDetail 插入对应行,只插了 t_Item 和 t_ICItem。

解决:插入物料时确保三张表同时有数据,t_ItemDetail 的 FDetailID 通过 t_Identity 取号,不要自己写死 1、2、3。同步后执行下面的校验语句,看有没有缺失:

-- 目标账套:找出有主档但没有明细排序行的记录 SELECT t.FItemID, t.FNumber FROM t_Item t LEFT JOIN t_ItemDetail d ON t.FItemID = d.FItemID WHERE d.FItemID IS NULL;

5.2 新增基础资料时 ID 直接撞车:忘了回写 t_Identity

现象:同步完成后,在目标账套界面上新增一条物料,系统提示主键冲突,或者新增出来的物料 ID 与已有记录重复。

原因:插入数据时只取了 t_Identity 的 FMaxID 值,插入完成后没有执行 UPDATE 回写。ID 池还停留在旧水位,界面程序再次取号时取到了同一个值。这个问题在单次同步时看不出来,下次有人在界面上操作才暴露,属于典型的“迟发炸弹”。

解决:每条记录插入完成后,同步更新 t_Identity:

-- 目标账套:插入后立即回写 ID 池 UPDATE t_Identity SET FMaxID = @DstFItemID WHERE FKey = 't_Item'; UPDATE t_Identity SET FMaxID = @DstFDetailID WHERE FKey = 't_ItemDetail';

5.3 源账套已删除的物料“复活”了:没过滤逻辑删除标记

现象:目标账套里出现十几条源账套界面上早就看不到的物料,编码以“旧_”开头,且与目标账套已有编码重复。

原因:源账套的基础资料删除多数是逻辑删除,记录还在表里,只是打上了删除标记。同步脚本里用的是SELECT * FROM t_Item,没有过滤条件,把已删除记录也搬了过去。

解决:同步前先确认删除标记字段。常见版本中 t_Item 和 t_ICItem 是 FDeleted 或 FFlag,执行SELECT TOP 1 * FROM t_Item WHERE FDeleted = 1能查出数据就说明字段存在:

-- 源账套:只同步有效记录 SELECT FItemID, FNumber, FName, FItemClassID FROM t_Item WHERE FDeleted = 0; -- 老版本为 FFlag = 0

5.4 物料同步后单位控件空白:漏了单位映射

现象:物料列表显示正常,打开单据分录,计量单位一栏是空的,或者显示成“无”。

原因:物料插入时直接带了源账套的 FUnitID,这个 ID 在目标账套的 t_MeasureUnit 里不存在。界面上找不到匹配的单位,只能显示空值。

解决:严格按照 4.1 的顺序,先把单位组和单位同步过去,再在物料插入 SQL 里用 Map_UnitID 做替换。替换后抽查几条,用下面 SQL 验证单位是否存在:

-- 目标账套:核对物料默认单位是否有效 SELECT i.FItemID, i.FNumber, i.FUnitID, u.FName FROM t_ICItem i LEFT JOIN t_MeasureUnit u ON i.FUnitID = u.FMeasureUnitID WHERE u.FMeasureUnitID IS NULL;

5.5 跨账套操作串库:用错了库名导致目标账套被覆盖

现象:同步完发现目标账套的数据比源账套还多了几百条,细看发现执行脚本时把 UPDATE 语句写在了源账套上,源账套数据被回写 ID 池的操作给改乱了。

原因:脚本里同时操作两个库,习惯用USE [AIS源账套]和USE [AIS目标账套]来回切换。一旦某个 UPDATE 语句忘了加库名前缀,就会落在当前连接的默认库上。最危险的是回写 t_Identity 那两条 UPDATE,写错库会直接污染源账套的 ID 池。

解决:所有跨账套语句一律写全限定名,禁用 USE 切换写法:

-- 一律使用三段式库名 UPDATE [AIS目标账套].[dbo].[t_Identity] SET FMaxID = @DstFItemID WHERE FKey = 't_Item'; INSERT INTO [AIS目标账套].[dbo].[Map_ItemID](SrcFItemID, DstFItemID, FNumber, FName, FItemClassID) VALUES(@SrcFItemID, @DstFItemID, @FNumber, @FName, @FItemClassID);

脚本开头加SET XACT_ABORT ON,配合事务保证任何一步出错立即整体回滚。这五条几乎覆盖了我在多个交付现场遇到过的八成问题,尤其是第五条,一旦发生没有后悔药,只能靠备份恢复。

6. 收尾技巧:同步之后的两条验证 SQL 与映射表习惯

同步脚本跑完,别急着交差。先做一遍数量对账,确认源账套和目标账套的基础资料数量对得上:

-- 源账套:按类别统计基础资料数量 SELECT FItemClassID, COUNT(*) AS Cnt FROM [AIS源账套].[dbo].[t_Item] WHERE FDeleted = 0 GROUP BY FItemClassID; -- 目标账套:按类别统计基础资料数量 SELECT FItemClassID, COUNT(*) AS Cnt FROM [AIS目标账套].[dbo].[t_Item] WHERE FDeleted = 0 GROUP BY FItemClassID;

两边的 FItemClassID 和 Cnt 如果完全一致,说明主档行数量没问题。接着做编号一致性校验,找目标账套里多出来或者漏掉的编码:

-- 源账套有、目标账套没有的编码 SELECT FNumber FROM [AIS源账套].[dbo].[t_Item] WHERE FDeleted = 0 EXCEPT SELECT FNumber FROM [AIS目标账套].[dbo].[t_Item] WHERE FDeleted = 0;

逻辑说明:EXCEPT 取差集,第一段查源账套全部有效编码,第二段查目标账套全部有效编码,结果是漏同步的名单。反过来说,目标账套多出来的编码会出现在 EXCEPT 的第二段里,那也是需要人工确认的差异。参数说明:FDeleted 同样要带上,否则把源账套已删除记录也算进来,数量永远不会平等。

映射表习惯才是这套方案真正的护身符。我从第一次做跨账套同步开始,就强制要求每个账套的映射表带时间戳后缀,比如 Map_ItemID_20250601,每次增量同步都基于上一次的映射表来比对。增量同步的判定语句其实很简单,就是 3.3 里那个 IF NOT EXISTS 的判断。有了这个习惯,哪怕三个月后需要反查“目标账套这条物料当年是从源账套哪一条搬过来的”,一条 SQL 就能定位,不用去翻备份。从那以后我每次做账套间同步,都强制先跑一遍数量对账和编号差集,再动下一步。这套 SQL 资源里的主体脚本和避坑清单直接拿去项目里改库名就能跑,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询