3

我有 2 张桌子:

  • 订单(带有身份订单 ID 字段)
  • OrderItems(带有外键来指示订单 ID)

在存储过程中,我有一个需要复制的订单列表。有没有一种在没有游标的存储过程中执行此操作的好方法?


编辑:

这是在 SQL Server 2008 上。

该表的示例规范可能是:

CREATE TABLE Order (
   OrderID INT IDENTITY(1,1),
   CustomerName VARCHAR(100),
   CONSTRAINT PK_Order PRIMARY KEY (OrderID)
)

CREATE TABLE OrderItem (
   OrderID INT,
   LineNumber INT,
   Price money,
   Notes VARCHAR(100),
   CONSTRAINT PK_OrderItem PRIMARY KEY (OrderID, LineNumber),
   CONSTRAINT FK_OrderItem_Order FOREIGN KEY (OrderID) REFERENCES Order(OrderID)
)

存储的过程传递了一个“fred”的customerName,因此它试图克隆CustomerName =“fred”的所有订单。

举一个更具体的例子:

Fred 恰好有 2 个订单:

  • 订单 1 的行号为 1,2,3
  • 订单 2 的行号为 1、2、4、6。

如果表中的下一个身份是 123,那么我想创建:

  • 使用第 1、2、3 行订购 123
  • 使用第 1、2、4、6 行订购 124
4

1 回答 1

4

在 SQL Server 2008 上,您可以使用MERGEand子句从插入OUTPUT中获取原始值和克隆值之间的映射,然后加入该映射以克隆 OrderItems。idOrders

DECLARE @IdMappings TABLE(
  New_OrderId INT,
  Old_OrderId INT)  

;WITH SourceOrders AS
(
SELECT *
FROM Orders
WHERE CustomerName = 'fred'
)
MERGE Orders AS T
USING SourceOrders AS S
ON 0 = 1
WHEN NOT MATCHED THEN
  INSERT (CustomerName )
  VALUES (CustomerName )
OUTPUT inserted.OrderId,
       S.OrderId INTO @IdMappings;  

INSERT INTO OrderItems
SELECT New_OrderId,
       LineNumber,
       Price,
       Notes
FROM   OrderItems OI
       JOIN @IdMappings IDM
         ON IDM.Old_OrderId = OI.OrderID
于 2011-12-20T16:59:35.123 回答