我有 2 个表:
- 订单(带有身份订单 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,因此它试图克隆所有 CustomerName = 'fred' 的订单。
举个更具体的例子:
Fred 正好有 2 个订单:
- 订单 1 的行号为 1、2、3
- 订单 2 的行号为 1、2、4、6。
如果表中的下一个身份是 123,那么我想创建:
- 使用第 1、2、3 行订购 123
- 使用第 1、2、4、6 行订购 124
最佳答案
在 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
关于sql-server - TSQL插入一组行和相关行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8578830/