我有两张桌子:
在存储过程中,我有一份需要复制的订单列表。有没有一种很好的方法可以在存储过程没有游标的情况下执行此操作?
编辑:
这是在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 ='fred'的所有订单。
举一个更具体的例子:
弗雷德碰巧有2个订单:如果表中的下一个标识是123,那么我想创建:
答案 0 :(得分:4)
在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