我见过几个与此类似的问题,但没有人给我答案。
所以这是示例
[表A] :
ID pk/auto-increment
Name
Age
...
[表B] :
ID pk/auto-increment
FK_A_ID fk
Comment
我导入的数据包含超过700行(并且正在增长)
[表格导入] 姓名/年龄/ ... /评论
是否可以使用类似于以下的查询:
INSERT INTO [TABLE A] (Name, Age, ...), [Table B] (FK_A_ID, Comments)
SELECT
Name, Age, ..., @@IDENTITY, Comment
FROM
[TABLE Import]
或者是一个较短的问题,是否可以在引用第一个插入的同一查询中插入2个表? - 当我把它改正时,似乎不太可能。
由于
答案 0 :(得分:2)
你不能。但您可以使用交易,如下所示:
START TRANSACTION;
INSERT INTO tableA
SELECT Name, Age, ... FROM tableImport;
INSERT INTO tableB
SELECT A.ID, I.Comment
FROM tableA A INNER JOIN tableImport I
ON A.Name = I.Name AND A.Age = I.Age AND ...;-- (if columns not unique)
COMMIT;
答案 1 :(得分:0)
我认为您可以使用一些临时表和row_number功能,然后从临时表中执行表A和表B中的单独插入
<强> UNTESTED 强>
create table source
(
Name varchar(50),
age int,
comment varchar(100)
)
go
insert into source
(name, age, comment)
values
('adam',12,'something'),
('steve',12,'everything'),
('paul',12,'nothing'),
('john',12,'maybe')
create table a
(
id int identity(1,1) not null,
name varchar(50),
age int,
rowid int
)
go
create table b
(
id int identity(1,1) not null,
comment varchar(50),
fkid int not null
)
go
declare @tempa table
(
RowID int,
Name varchar(50),
age int,
comment varchar(100)
)
go
insert into @tempa
(rowid, name, age, comment)
SELECT ROW_NUMBER() OVER(ORDER BY name DESC) AS RowId,
name, age, comment
FROM source
go
insert into a
(name, age, rowid)
select name, age, rowid
from @tempa
insert into b
(comment, fkid)
select t.comment,
a.id as fkid
from @tempa t inner join a a
on t.rowid = a.rowid
答案 2 :(得分:0)
在我看来,最好的方法是创建存储过程并在发生故障时回滚。如果这样做,则不需要事务,因为在提供“COMMIT”命令之前不会插入任何内容。