3

私は2つのテーブルを持っています:

  • 注文(ID注文IDフィールドを使用)
  • OrderItems(注文IDへの外部キーを使用)

ストアドプロシージャには、複製する必要のある注文のリストがあります。カーソルなしでストアドプロシージャでこれを行う良い方法はありますか?


編集:

これはSQLServer2008にあります。

テーブルのサンプル仕様は次のとおりです。

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'であるすべての注文のクローンを作成しようとします。

より具体的な例を挙げます。

フレッドにはたまたま2つの注文があります。

  • 注文1の行番号は1、2、3です。
  • 注文2の行番号は1、2、4、6です。

テーブル内の次のIDが123の場合、次を作成します。

  • 行1、2、3で123を注文する
  • 行1、2、4、6で124を注文する
4

1 に答える 1

4

MERGESQL Server 2008では、and句を使用してOUTPUT、元の値と複製され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
于 2011-12-20T16:59:35.123 に答える