我一直在搜索,我还没有找到一个使用merge来填充相关表格的例子。
Northwind DB Order
&可以使用OrderDetail
个表。 (在我们的场景中,我们的表格深度为3级。)
为简单起见,我们假设我们有以下表格。
订单
OrderID PK
OrderNumber
订单明细
OrderID - PK
OrderLineItemNumber PK - FK to Orders.OrderID field
OrderDetailDetails
OrderID - PK - FK to OrderDetails.OrderID
OrderLineItemNumber - PK - FK to OrderDetails.OrderLineItemNumber
OrderSequenceNumber - PK
此外,在此方案中,记录将写入与上表相同的登台表。合并需要将3个临时表中的记录合并到3个匹配的生产表中。
制作Order
表的OrderId
不会共享暂存Order
表OrderId
值。
因此,如果满足合并条件,则必须插入Order
表以生成OrderId
(设置为identity),因为OrderId
需要OrderDetail
}&
OrderDetailDetails
行。
现在我已经用C#写了一个服务来完成所有这些,但它不是那么高效。
MERGE
被发现,所以我们正在研究它是否可以在这种情况下使用它。任何提示或指示将不胜感激。
感谢。
编辑:我现在将输出存储值用于名为@MergeOutput的临时表。
Declare @MergeOutput Table
(
ActionType varchar(10),
InsertedOrderId int,
StagingOrderID int,
DeletedOrderId int
);
However, I need to do a Merge on all 3 tables. (Order, OrderDetail & OrderDetailDetails)
Also, these tables have more fields than just the Id's.
So I've started creating the 2nd Merge for the OrderDetail table.
MERGE OrderDetail AS OD
USING(
SELECT OrderID,
OrderLineItemNumber,
ProductId
FROM OrderDetail AS OD
where OrderId IN (Select StagingOrderID from @MergeOutput where ActionType = 'INSERT'
) AS src(OrderID,
OrderLineItemNumber,
ProductId
)
ON (OD.OrderId = src.Order AND OD.OrderLineItemNumber = src.OrderLineItemNumber)
WHEN NOT MATCHED By Target THEN
INSERT INTO <-- (This doesn't work no matter what I've tried so far.)
Select (Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId
;
我在上面的代码中看到以下错误。 “关键字'附近的语法不正确'到'
我需要Merge的功能来移动所有3个表上的记录
看起来我终于有了这个工作。我必须将Insert语句更改为如下。
Insert(OrderId, OrderLineItemId, ProductID)
Values((Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId)
我之前尝试过这个Insert语句。我只是想通了我必须包装选择parens()。
感谢大家的帮助。我希望我可以把它带到第三张桌子的合并。
答案 0 :(得分:0)
这是一个令人讨厌的问题,一直存在。您需要提取插入的标识值。在SQL Server中,您可以使用OUTPUT子句(http://msdn.microsoft.com/en-us/library/ms177564.aspx)和INSERT“虚拟表”来执行此操作。这允许您在一个语句中输出所有插入的ID。
然后,您可以将ID推送到临时表中,并使用它们插入具有相应主ID的详细记录,如下所示:
INSERT INTO Detail
SELECT * from Staging_Detail
JOIN #MasterIDs on Staging_Detail.MasterID = #MasterIDs.MasterID