2015-10-16 116 views
0

我已經看到類似這樣的幾個問題,但沒有人給我我正在尋找的答案。SQL Server:在一個查詢中插入2個表

因此,這裏的例子

[表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

我認爲你必須編寫查詢插入單獨查詢。 –

+0

不,這是不可能的 - 一個'INSERT' **總是**完全違背** ONE **表格。你可以在這兩個表上創建一個視圖,將你的數據插入到該視圖中,並用INSTEAD OF INSERT觸發器捕獲這些插入,但最終在觸發器內部必須有* *兩個** INSERT'語句再次.... –

回答

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 
+0

不要忘記一些清理代碼來拆除臨時表 –

0

你不行。但是你可以使用事務,如:

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; 
0

在我的真實想法,要做到這一點的最好辦法是在失敗的情況下創建一個存儲過程和回滾。如果你這樣做,你不需要一個事務,因爲直到你提供了「COMMIT」命令,什麼都不會被插入。