假定由以下表格组成的架构:

巴兹

BazID (PK, Identity)
Description

FooTemplate (Baz可能有零到许多FooTemplate)
FooTemplateID (PK, Identity)
BazID (FK)
Description
NextGenerationDate

BarTemplate (一个FooTemplate可能有零到许多BarTemplate)
BarTemplateID (PK, Identity)
FooTemplateID (FK)
Description

Foo (Baz可能有零到许多Foos)
FooID (PK, Identity)
BazID (FK)
Description

条形(Foo可能有零到许多条形)
BarID (PK, Identity)
FooID (FK)
Description

每天将执行一个存储过程,以为已过其下一代日期的关联Foo实体生成BarBaz实体。

该过程的第一部分看起来像这样:
DECLARE @GeneratedFooIDList TABLE (INT FooID);
INSERT Foo (BazID, Description)
OUTPUT inserted.FooID INTO @GeneratedFooIDList
SELECT
  BazID
  Description
FROM
  FooTemplate
WHERE
  NextGenerationDate < GETDATE()

我的问题是我现在可以执行什么语句来生成正确的Bar实体,并使它们与新创建的Foo实体正确关联?

编辑:该过程将在运行SQL Server 2005的服务器上执行。

编辑2:谢谢大家的帮助。在仔细考虑了这些信息之后,我选择了另一种解决方案。我已将Foo表中的主键更改为不再是自动生成的标识列,这样可以执行对临时表的中间插入,以捕获相关的FooTemplateID和FooID

最佳答案

如果我正确理解您的架构

declare @GeneratedFooIDList table (FooID int, FooTemplateID int)
declare @Date datetime = getdate()

/*
insert Foo (BazID, Description)
    output inserted.FooID, FT.FooTemplateID into @GeneratedFooIDList
select
    FT.BazID,
    FT.Description
from FooTemplate as FT
where
    FT.NextGenerationDate < @Date
*/

merge into Foo using
(
    select *
    from FooTemplate as FT
    where
        NextGenerationDate < @Date
) as FT on 1 = 0
when not matched then
insert (BazID, Description)
values (BazID, Description)
output inserted.FooID, FT.FooTemplateID into @GeneratedFooIDList;

insert Bar (FooID, Description)
select
    G.FooID
    BT.Description
from BarTemplate as BT
    inner join @GeneratedFooIDList as G on G.FooTemplateID = BT.FooTemplateID

好吧,如果您有SQL Server 2005,则此方法将无法正常工作。我可以建议另一种解决方案,因为它取决于(BazID, Description)表中组合FooTemplate的唯一性。如果有帮助,也可以使用日期
http://sqlfiddle.com/#!3/ee576/29
declare @GeneratedFooIDList table (FooID int)
declare @Date datetime = getdate()

insert Foo (BazID, Description)
    output inserted.FooID into @GeneratedFooIDList
select
    FT.BazID,
    FT.Description
from FooTemplate as FT
where
    FT.NextGenerationDate < @Date

insert Bar (FooID, Description)
select
    G.FooID,
    BT.Description
from @GeneratedFooIDList as G
    inner join Foo as F on F.FooID = G.FooID
    inner join FooTemplate as FT on FT.BazID = F.BazID and FT.Description = F.Description
    inner join BarTemplate as BT on BT.FooTemplateID = FT.FooTemplateID

关于sql - 试图避免RBAR!如何将相关表上的插入内容关联为基于集合的操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13030723/

10-11 04:59