gpt4 book ai didi

sql-server - TSQL插入一组行和相关行

转载 作者:行者123 更新时间:2023-12-04 00:04:27 24 4
gpt4 key购买 nike

我有 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 上,您可以使用 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

关于sql-server - TSQL插入一组行和相关行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8578830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com