如何同时在两个不同的表中插入多行。
我有3张桌子
create table temp_source
(
GroupID varchar(10) primary key,
ExMsg varchar(20)
);
create table temp_exceptions
(
ExID int identity primary key,
ExMsg varchar(20)
);
create table temp_sjobs
(
GroupID varchar(10) primary key,
ExID int
);
temp_sjobs.ExID
与temp_exceptions.ExID
现在我想同时将temp_source
表中的所有行插入temp_sjobs
和temp_exceptions
表。
我能做到的唯一方法是遍历temp_source
表中的每一行,将行插入temp_exceptions
表,获取@ExID = scope_identity()
并将该行插入
temp_sjobs
表。
这看起来非常慢,并且由于循环,查询需要花费大量时间。
是否有更好的方法可以同时插入多个表格。
答案 0 :(得分:1)
使用OUTPUT条款可以帮助您的案例,请在下面的示例查询中找到
DECLARE @temp_source table
(
GroupID varchar(10) primary key,
ExMsg varchar(20)
);
DECLARE @temp_exceptions table
(
ExID int identity primary key,
ExMsg varchar(20)
);
INSERT INTO @temp_source Select 1,'message1'
INSERT INTO @temp_source Select 2,'message2'
INSERT INTO @temp_source Select 3,'message3'
INSERT INTO @temp_source Select 4,'message4'
DECLARE @temp_sjobs table
(
GroupID varchar(10) primary key,
ExID int
);
DECLARE @temp_InsertedExceptionOutput table
(
ExID Int,
ExMsg varchar(20)
)
INSERT INTO @temp_exceptions (ExMsg)
OUTPUT inserted.ExID, inserted.ExMsg into @temp_InsertedExceptionOutput
Select ExMsg from @temp_source
INSERT INTO @temp_sjobs(GroupID,ExID)
SELECT ts.GroupID, eo.ExID
FROM @temp_InsertedExceptionOutput eo
JOIN @temp_source ts on ts.ExMsg = eo.ExMsg
Select * from @temp_source
Select * from @temp_exceptions
Select * from @temp_sjobs
使用表格设计,我认为ExMsg是独一无二的,您可能会发现完整性问题。
答案 1 :(得分:0)
当然,您可以执行以下操作 - 可能是最简单的方法:
SELECT INTO temp_sjobs FROM temp_source
SELECT INTO temp_exceptions FROM temp_source
如果您想同时执行所有操作,可以将其设为 CTE 或 CURSOR 。除此之外,您必须将其作为 TRIGGER - 基本上,如果 temp_source 中有新条目,它将 INSERT a新记录到 temp_sjobs 和 temp_exceptions 。
答案 2 :(得分:0)
我认为你最好的选择是使用两个插入语句
INSERT INTO temp_exception (ExMsg)
SELECT DISTINCT ExMsg
FROM temp_source
INSERT INTO temp_sjobs (GroupID, ExID)
SELECT ts.GroupID, te.ExID
FROM temp_exceptions te
JOIN temp_source ts
ON ts.ExMsg = te.ExMsg
首先构建temp_exception表,然后创建temp_sjobs表并将两者链接在一起。
答案 3 :(得分:0)
据我所知,您希望将表temp_source拆分为temp_exceptions和temp_sjobs,并在它们之间使用外键关系。有些时候我也遇到过同样的情况,我选择了下面的解决方案以获得更好的性能:
declare @Exid int
select @Exid = max(ExID) from temp_exceptions
if @Exid is null
set @Exid = 0
set Identity_insert temp_exceptions ON
insert into temp_exceptions (ExID, ExMsg)
select @Exid + row_number() over(order by (select NULL)), ExMsg from temp_source
insert into temp_sjobs (ExID, GroupID)
select @Exid + row_number() over(order by (select NULL)), GroupID from temp_source
set Identity_insert temp_exceptions OFF
select * from temp_exceptions;
select * from temp_sjobs;