Il existe de nombreux moyens efficaces de faire cela SQL 2005 et 2008. Voici une façon de le faire en utilisant SQL2000.
Vous devez déclarer une variable pour contenir le OrderId cloné et créer une table temporaire pour contenir les enregistrements clonés qui iront dans la table OrderItemDoc.
Voici un exemple de code sur la façon de procéder. Il s'appuie sur la séquence pour lier les anciens éléments de commande aux nouveaux dans la table OrderItemDoc.
CREATE PROCEDURE CloneOrder
(
@OrderId int
)
AS
DECLARE @NewOrderId int
--create the cloned order
INSERT Order(...OrderColumnList...)
SELECT ...OrderColumnList... FROM ORDER WHERE OrderId = @OrderId;
-- Get the new OrderId
SET @NewOrderId = SCOPE_IDENTITY();
-- create the cloned OrderItems
INSERT OrderItem(OrderId,...OrderItemColumns...)
SELECT @NewOrderId, ...OrderItemColumns...
FROM OrderItem WHERE OrderId = @OrderId
-- Now for the tricky part
-- Create a temp table to hold the OrderItemIds and DocumentIds
CREATE TABLE #TempOrderItemDocs
(
OrderItemId int,
DocumentId int
)
-- Insert the DocumentIds associated with the original Order
INSERT #OrderItemDocs(DocumentId)
SELECT
od.DocumentId
FROM
OrderItemDoc od
JOIN OrderItem oi ON oi.OrderItemId = od.OrderItemId
WHERE
oi.OrderId = @OrderId
ORDER BY
oi.OrderItemId
-- Update the temp table to contain the newly cloned OrderItems
UPDATE #OrderItemDocs
SET
OrderItemId = oi.OrderItemId
FROM
OrderItem oi
WHERE
oi.OrderId = @NewOrderId
ORDER BY
oi.OrderItemId
-- Now to complete the Cloning process
INSERT OrderItemDoc(OrderItemId, DocumentId)
SELECT
OrderItemId, DocumentId
FROM
#TempOrderItemDocs
Cela devrait faire l'affaire, merci beaucoup. – Nick