假定由以下表格组成的架构:
巴兹
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
实体生成Bar
和Baz
实体。该过程的第一部分看起来像这样:
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/