2011-12-20 96 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