【发布时间】:2011-05-03 10:51:22
【问题描述】:
请耐心等待我解释我的情况。 我有以下两个表:
Items(id, plan, free)
-- ‘id’是标识列。
ItemsIncludes(MasterId, IncludeId)
有两种类型的项目 - 购买和免费(包括)。无论如何,这两种类型的项目都存储在 Items 表中(显然位字段“free”是根据类型设置的)。 ItemsIncludes 表在购买的商品 (MasterId) 和免费随附的商品 (IncludeId) 之间建立一对多的关系。
第 1 步是从购物车中插入购买的商品(没问题)。
第 2 步是根据购买项目的计划为插入的每个购买项目插入免费项目(这与面临的问题无关)。
第 3 步是将前 2 步中生成的 ID 以正确的关系插入到 ItemsIncludes 表中(问题)。
要求是捕获插入期间生成的免费 itemId 及其购买的 itemId。如果以下是合法的,则输出子句会这样做:
第二步--
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 列表的任何标识符的语句。例如:
注意:我没有运行以下示例,但它是合法的。
Delete Items
Output iti.MasterID, deleted.ID into @ItemsIncludesIntermediate
From items it
Join ItemsIncludes iti on it.ID = iti.IncludeId
简而言之,如果我不能使用输出子句执行此操作,那么我如何捕获生成的免费 itemId 以及为其生成的已购买 itemId?
如果可能的话,我愿意查看而不是触发方法。最根本的是我不想改变结构。例如。我不想删除 ItemsIncludes 表并将 MasterItemId 包含到 Items 表中。
这个问题起初看起来很简单,但现在让我很紧张
【问题讨论】:
标签: sql-server tsql insert identity