TSQL插入一组行和从属行

时间:2011-12-20 16:42:02

标签: sql-server sql-server-2008 tsql set-based

我有两张桌子:

  • 订单(带有身份订单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 ='fred'的所有订单。

举一个更具体的例子:

弗雷德碰巧有2个订单:

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

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

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

1 个答案:

答案 0 :(得分:4)

在SQL Server 2008上,您可以使用MERGEOUTPUT子句来获取插入到id的原始值和克隆Orders值之间的映射,然后加入到克隆OrderItems。

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