Начните с таблицы чисел, которая достаточно велика для обработки максимальной суммы заказа:
CREATE TABLE Numbers (
Num int NOT NULL PRIMARY KEY CLUSTERED
)
-- SQL 2000 version
INSERT Numbers VALUES (1)
SET NOCOUNT ON
GO
INSERT Numbers (Num) SELECT Num + (SELECT Max(Num) FROM Numbers) FROM Numbers
GO 15
-- SQL 2005 and up version
WITH
L0 AS (SELECT c = 1 UNION ALL SELECT 1),
L1 AS (SELECT c = 1 FROM L0 A, L0 B),
L2 AS (SELECT c = 1 FROM L1 A, L1 B),
L3 AS (SELECT c = 1 FROM L2 A, L2 B),
L4 AS (SELECT c = 1 FROM L3 A, L3 B),
L5 AS (SELECT c = 1 FROM L4 A, L4 B),
N AS (SELECT Num = ROW_NUMBER() OVER (ORDER BY c) FROM L5)
INSERT Numbers(Num)
SELECT Num FROM N
WHERE Num <= 32768;
Затем, сразу после ваших утверждений INSERT:
INSERT #OrderDelivery (OrderTransactionId, MediaTypeId)
SELECT
OT.OrderTransactionId,
P.MediaTypeId
FROM
#OrderTransaction OT
INNER JOIN #Product P ON OT.ProductId = P.ProductId
INNER JOIN Numbers N ON N.Num BETWEEN 1 AND OT.Quantity
Это должно сделать это!
Если по какой-то причине у вас возникли сомнения по поводу размещения таблицы постоянных номеров в вашей базе данных (что я не понимаю, поскольку это прекрасный инструмент), то вы можете просто присоединиться к данной CTE вместо самой таблицы. В SQL 2000 вы можете создать временную таблицу и использовать цикл, но я бы настоятельно не рекомендовал это делать.
Настоятельно рекомендуется таблица чисел. Не стоит беспокоиться о том, что какое-то будущее изменение нарушит его (набор целых чисел не изменится в ближайшее время). Некоторые люди используют таблицу Numbers с миллионом номеров, которые занимают всего около 4 МБ.
Чтобы ответить на критику таблицы чисел: если дизайн базы данных использует таблицу чисел, то эту таблицу не нужно будет менять. Это как любая другая таблица в базе данных, и на нее можно положиться. Вы не слишком беспокоитесь о сбоях запросов к таблице Orders, потому что однажды таблица может не существовать, поэтому я не понимаю, почему возникла бы аналогичная проблема с другой таблицей, которая требуется и зависит от нее.
UPDATE
За время, прошедшее с момента написания этого ответа, я узнал о таблице master.dbo.spt_values
, в которой есть столбец number
. При запросе where type='P'
вы получаете 0 - 255 в SQL 2000 и 0 - 8191 в SQL 2005 и выше. (Также есть потенциально полезные столбцы low
и high
.) Вы можете несколько раз соединить эту таблицу с самим собой, если необходимо, даже в SQL 2000, очень быстро получить кучу строк.