TSQL для вставки набора строк и зависимых строк - PullRequest
3 голосов
/ 20 декабря 2011

У меня есть 2 таблицы:

  • Заказ (с идентификатором поля идентификатора заказа)
  • OrderItems (с внешним ключом для идентификатора заказа)

В сохраненном процессе у меня есть список заказов, которые мне нужно продублировать.Есть ли хороший способ сделать это в хранимой процедуре без курсора?


Редактировать:

Это на 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', поэтому он пытается клонировать все заказы, где CustomerName = 'fred'.

Чтобы привести более конкретный пример:

У Фреда есть 2 заказа:

  • В заказе 1 есть номера строк 1,2,3
  • В заказе 2 естьномера строк 1,2,4,6.

Если следующий идентификатор в таблице был 123, я бы хотел создать:

  • Порядок 123 со строками 1,2,3
  • Заказ 124 со строками 1,2,4,6

1 Ответ

4 голосов
/ 20 декабря 2011

В SQL Server 2008 вы можете использовать MERGE и предложение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...