我最近的任务是编写一个导入 Quantity Price Break Discounts 的 Sage 导入工具。
有问题的 Sage 200 表是:
- StockItem - 主要产品表
- StockItemDiscount - 主折扣表
- StockItemQtyDiscBreak - 折扣数量价格中断
我不会用架构信息让你厌烦,因为它与我的问题无关,我只想说 - 所有 3 个表中的主键都是没有标识集的 BigInt(叹息),1 个 StockItem 可以有很多折扣,1 个折扣可以有很多 Qty Discount休息。
现在,要创建导入例程,我首先必须分析 Sage 200 在 SQL 上做了什么,如果您在 sage 中手动创建 Discount 和 Breaks(使用 SQL Profiler)。正如我所说,Sage 200 不使用标识列,而是使用计数器表。
将新行插入 StockItemDiscount 执行以下操作:
UPDATE [Counter] SET [NextValue] = [NextValue] + 10 WHERE [CounterID] = 1
然后它选择新的 ID:
SELECT NextValue FROM Counter WHERE CounterID = 1
然后它使用刚刚从计数器中选择的新值插入新行:
INSERT INTO StockItemDiscount (StockItemDiscountID, /.../) VALUES (@NewID, /.../)
我的问题是:Sage到底为什么要这样做?背后的原因可能是什么?(特别是 +10 THEN 读取值)
所有表也共享相同的计数器,因此 1 个表中的 5 行会导致另一个表的 id 出现间隙 - 我真的不知道他们为什么这样做?
我问的原因:在插入一行后,StockItemDiscount
我需要删除任何相关行StockItemQtyDiscBreak
并插入替换 - 但是,使用 SQL 分析器我看不到计数器表的增量,除非我插入 5 个或更多折扣(第 6 个导致它命中再次查看计数器表,就好像 Sage UI 保留了这 10 个 ID,将它们用于各种插入,然后根据需要保留另外 10 个 - 这对我来说似乎很奇怪?