У меня есть эти промежуточные столы:
- Заказ (PK = OrderID),
- SubOrder (PK = SubOrderID, FK = OrderID) и
- Item (PK = ItemID, FK1 = SubOrderID, FK2 = OrderID).
Я установил отношения на клиенте (C # .NET и скопированные таблицы в промежуточные таблицы в SQL Server с использованием SQLBulCopy).
Теперь мне нужно установить отношения Родитель / Дитя / Внучка на сервере.
У меня есть сценарии, которые могут это сделать (я использую операторы OUTPUT вместе с операторами Insert и вывожу PK во временные таблицы, которые позже использую
вставить дочерние строки).
Обратите внимание, что изначально у меня были отношения внешнего ключа между Grand-child и parent (Item and Order), установленные на клиенте.
SubOrder вводится как ограничение количества (Представьте, что это Максимальное количество элементов, которое может поместиться в поле Отгрузки. Все элементы имеют одинаковый размер - в моем случае строки Элементов имеют одинаковый размер.)
Основная проблема: у меня есть десятки тысяч элементов для вставки в производственные таблицы, давайте их назовем: OrderP, SubOrderP и ItemP. Я также динамически генерирую временные таблицы: OrderPWithRealPK и SubOrderPWithRealPK, которые содержат только что вставленные родительские PK.
У меня может быть всего 1 Орден, 1 Подотряд и 1 Предмет, и много раз так же или 1 Порядок, 10 Подотряд и в каждом Подзаказе до 100 элементов Предмета (поэтому распределение (n) Порядка, (м) Элементы SubOrder и (k) Item непредсказуемы.
В таблице ниже у меня есть эти параметры:
- N = 7 число Order-s
- M = 14 число SubOrder-s
- K = 23 число Item-s
- L = 2 максимальное количество элементов в подзаказе
- J = прибл. количество элементов, которые будут вставлены в транзакцию. (но включенные элементы должны принадлежать к одному и тому же заказу, но может быть нормально находиться вместе в одном подзаказе)
P = Нет. предметов в крупнейшем заказе. (это может привести к тому, что может быть J
число, но только если у нас есть большие порядки).
Если у нас много малых порядков, то J может быть предопределено. (В нашем примере около 10)
Учитывая (K) количество элементов, я хотел бы создать относительно равные группы элементов, которые могут быть сразу вставлены в транзакцию, но должны быть представлены вместе с их родителями и, предпочтительно, бабушками и дедушками.
Сейчас у меня есть ручная транзакция, в которой я сначала вставляю специальное поле со значением «TR» (представляющее «В транзакции»), выполняю вставку и выполняю обновление с «00» для этого поля.
для обозначения всех Товаров, принадлежащих Заказу, вставляются и другие процессы с запросом этого специального поля на значение «00».
Было бы хорошо, если бы я мог избежать этого. Я думаю, что было бы нормально иметь транзакционную область до уровня SubOrder, если бы делать автоматическую транзакцию (с Begin Trans / End Trans)
Если у меня есть таблица ниже, допустим, что я хотел бы, чтобы элементы с этими заказами объединялись при сохранении в таблицу элементов (конечно, элемент PK будет сгенерирован с предложением OUTPUT):
- 1, 3, 4 и 5 (9 наименований)
- 2 (9 предметов)
- 6, 7 (4 темы)
Заказы могут быть вставлены в любом порядке, и предпочтительно элементы Suborder и Items должны быть вставлены в том порядке, в котором они были созданы.
Представьте, что я бы использовал цикл While, TOP (Z) и правильный запрос соединения для выбора элементов (Grand-Child, принадлежащий Parent-s и связанным дочерним элементам)
Для вставки в транзакцию.
SeqNo OrderID SubOrder ItemID No. of Items
-----------------------------------------------------------------------------------
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