2

如何将多行同时插入两个不同的表。

我有 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_sjobstemp_exceptions

我能做到的唯一方法是遍历表中的每一行temp_source,将行插入temp_exceptions表中,获取@ExID = scope_identity()并将该行插入 temp_sjobs表中。

这似乎很慢,并且由于循环,查询需要很多时间。

有没有更好的方法可以同时插入多个表。

4

4 回答 4

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 是独一无二的,否则您可能会发现完整性问题。

于 2014-07-18T16:03:11.893 回答
0

当然,您可以执行以下操作 - 可能是最简单的方法:

SELECT INTO temp_sjobs FROM temp_source
SELECT INTO temp_exceptions FROM temp_source

如果您想同时完成所有操作,您可以将其作为CTECURSOR。除此之外,您必须将其作为TRIGGER执行- 基本上,如果 temp_source 中有一个新条目,它将在temp_sjobstemp_exceptions插入一条新记录。

于 2013-10-17T21:24:44.757 回答
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;
于 2014-10-18T07:09:04.757 回答
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 表并将两者链接在一起。

于 2013-10-17T21:28:09.427 回答