SQL Server:在一个查询中插入2个表

时间:2015-10-16 10:11:15

标签: sql-server insert-into

我见过几个与此类似的问题,但没有人给我答案。

所以这是示例

[表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个表? - 当我把它改正时,似乎不太可能。

由于

3 个答案:

答案 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”命令之前不会插入任何内容。