2011-05-03 79 views
2

请耐心等待我解释我的情况。 我有以下两个表格:在插入两行中的一行时捕获两行之间的关系

Items(id, plan, free) 

- 'id'是标识列。

ItemsIncludes(MasterId, IncludeId) 

有两种类型的项目 - 购买和免费(包括)。无论如何,这两种类型的项目都存储在Items表中(显然,根据类型设置了“free”位字段)。 ItemsIncludes表建立了一个购买的项目(MasterId)和包含的免费项目(IncludeId)之间的一对多关系。

第1步是从购物车插入购买的物品(没问题)。

步骤2是根据购买物品的计划(与面临的问题无关)插入每个购买物品的免费物品。

第3步是将在前两个步骤中生成的ID以正确的关系插入到ItemsIncludes表(问题)中。

要求是捕获插入期间生成的免费itemId及其购买的itemId。输出条款会做这个,如果下面是合法的:

步骤2--

Declare @ItemsIncludesIntermediate table(MasterId int, IncludeId int) 
Insert into Items 
(PlanId, IsFree) 
Output it.ID -- Illegal 
, inserted.ID into @ItemsIncludesIntermediate 
Select pli.IncludePlanId, 1 
From Items it 
Join PlansIncludes pli on it.PlanId = pli.MasterPlanId 

该计划的结构也相似,但不相关的,因此没有描述手头的问题。

在插入期间,SQL Server不允许在输出子句中引用除插入的列之外的其他字段;然而,在更新/删除的情况下,它是不一样的,在这种情况下,引用参与FROM列表的任何标识符的语句被允许。 E.G .:

注意:我没有运行以下示例,但它是合法的。

Delete Items 
Output iti.MasterID, deleted.ID into @ItemsIncludesIntermediate 
From items it 
Join ItemsIncludes iti on it.ID = iti.IncludeId 

总之,如果我不能做到这一点与输出条款,那我怎么才能获取免费的itemId为正在与这就是BEING生成它的购买的itemId一起产生的呢?

我打开查看,而不是触发器的方法,如果可能的话。根本的是我不想改变结构。例如。我不想删除ItemsIncludes表并将MasterItemId包含到Items表中。

问题看起来简单的在第一,但现在让我心烦

回答

1

如果使用SQL Server 2008中您可以使用merge而不是插入和获取的ID的映射。

看看这个问题关于如何做到这一点的更多细节。

Using merge..output to get mapping between source.id and target.id

+0

谢谢!有效。我已经融合在一起,但与您在相关问题中存在着同样的疑问。它实际上似乎是黑客合并的文件目的,但它看起来似乎没有其他的最佳解决方案。 – 2011-05-04 10:16:28