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

标签 sql-server sql-server-2008 tsql set-based

我有 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/

相关文章:

sql-server - 使用 UNION 时 SQL 返回的结果更少?

sql-server - 如何通过linq查询从表中只获取两个字段?

sql - try catch 更新单个记录中特定字段的日期和时间

c# - 改进在 sql server 中读取 XML 字符串

sql-server - 为我的复制发布者查找快照作业的脚本

SQL Server Management Studio - 使用特定位置的文件创建数据库

sql-server - 找不到 SQL Server 配置管理器

sql-server-2008 - 如何有条件地隐藏 Reporting Services 报表中的页眉

sql - 为什么这个 sql 行不工作

tsql - T-SQL-如何交换行和列