2011-12-20 72 views
3

的我有2个表:TSQL插入一组行和相关行

  • 订单(有标识订单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) 
) 

存储的过程传递弗雷德的”一个客户名称',所以它试图克隆CustomerName ='fred'的所有订单。

为了给出一个更具体的例子:

佛瑞德恰好有2个数量:

  • 订单1具有行号1,2,3
  • 订单2具有行号1,2, 4,6。

如果表中的下一个标识为123的话,我希望创建:

  • 用线1,2,3
  • 订购124线1,2,4定单123 ,6
+0

你能更具体吗? – JNK 2011-12-20 16:44:50

+1

你是如何通过你的名单?什么版本的SQL Server? – MatBailie 2011-12-20 16:45:21

+1

通过复制,你的意思是将相同的信息写入同一张表,但使用不同的ID? – GSerg 2011-12-20 16:45:23

回答

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