SQL Server 2005 - Как разделить несколько вставок на ... Выходные данные Выберите TOP (z) ... From if (Approx) Известно максимальное количество дочерних строк в транзакции - PullRequest
2 голосов
/ 08 февраля 2010

У меня есть эти промежуточные столы:

  • Заказ (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
...