2

我有这些临时表:

  • 订单(PK=OrderID),
  • SubOrder (PK=SubOrderID, FK=OrderID) 和
  • 项目(PK=ItemID,FK1=SubOrderID,FK2=OrderID)。

我在客户端上建立了关系(C#.NET 并使用 SQLBulCopy 将表复制到 SQL Server 中的暂存表)。

现在我需要在服务器上建立父/子/孙子关系。

我有可以做到这一点的脚本(我将 OUTPUT 语句与 Insert 语句一起使用,并将 PK 输出到临时表中,稍后我用它来插入子行)。

请注意,最初我在客户端上建立了孙子和父级(项目和订单)之间的外键关系。

SubOrder 是作为数量限制引入的(想象一下,作为可以放入装运箱的最大物品。所有物品的尺寸相同——在我的情况下,物品行的尺寸相同。)

主要问题:我可以将数以万计的项目插入到生产表中,我们称它们为:OrderP、SubOrderP 和 ItemP。我还动态生成临时表:OrderPWithRealPK 和 SubOrderPWithRealPK,它们保存刚刚插入的父 PK。

我可以有少至 1 个订单、1 个子订单和 1 个项目,并且多次这样或 1 个订单、10 个子订单,并且在每个子订单中最多 100 个项目元素(因此 (n) 订单、(m) 子订单和 ( k) 项目元素是不可预测的。

在下表中,我有这些参数:

  • N=7 订单数
  • M=14 个 SubOrder-s
  • K=23 项目数
  • L=2 子订单中的最大项目数
  • J = 大约。要在事务中插入的项目数。(但是包含的项目需要属于同一个Order,但可能一起在同一个SubOrder中就可以了)

P=否。最大订单中的项目。(这可以J决定数字可以是多少,但前提是我们有更大的 Order-s)。

如果我们有很多小的 Order-s,那么 J 可以被预先确定。(在我们的例子中大约 10 个)

给定 (K) 个项目,我想创建相对相等的元素桶,这些元素可以在事务中一次插入,但要与它们的父母一起提交,最好是与祖父母一起提交。

现在我有一个手动交易,我首先插入一个带有“TR”值的特殊字段(代表“交易中”),然后插入并使用“00”对该字段进行更新以表示属于订单的所有项目被插入和其他进程查询值 '00' 的特殊字段。如果我能避免这种情况就好了。如果进行自动交易(使用 Begin Trans/End Trans),我认为将交易范围设置为 SubOrder 级别是可以的

如果我有一个下表,假设我希望将这些订单的项目保存到项目表中时一起去(当然项目 PK 将使用 OUTPUT 子句生成): - 1、3、4 和 5( 9 件) - 2 (9 件) - 6, 7 (4 件)

订单可以按任何顺序插入,最好是 Suborder 和 Items 元素需要按它们创建的顺序插入。想象一下,我将使用 While 循环和 TOP (Z) 以及适当的连接查询来选择要插入到事务中的项目(属于 Parent-s 和关联子元素的孙子元素)。

SeqNo OrderID SubOrder ItemID 项目数
-------------------------------------------------- ---------------------------------
01 1 1 100 2
02 1 1 101
==================================================== ==
03 2 2 201 9
04 2 2 202
05 2 3 301
06 2 3 302
07 2 4 401
08 2 4 402
09 2 5 501
10 2 5 502
11 2 6 503
==================================================== =
12 3 7 601 2
13 3 7 602
==================================================== =
14 4 8 801 1
==================================================== =
15 5 9 901 5
16 5 9 902
17 5 10 1001
18 5 10 1002
19 5 11 1201
====================================================
20 6 12 1201 1
====================================================
21 7 13 1301 3
22 7 13 1302
23 7 14 1401
4

0 回答 0