2015-04-22 42 views
0

我試圖從一個單一select語句插入到3個表中。這裏是我想要做的事:使用TSQL從單個選擇查詢插入到2個表中

insert into dbo.temp1 (name, location, city) 
select name, location, city from mytable. 

我希望能夠插入到3個表,一旦我運行SELECT語句,如插入到temp1中,TEMP2和TEMP3。

我該怎麼做?謝謝。

+0

你能確定表的數量嗎?問題標題提到了兩個,身體提到了三次。 – HABO

+0

每次將數據添加到temp1時,是否總是希望將數據添加到這三個表中?如果是這樣,可以使用觸發器。 – Mackers

回答

0

沒有辦法用一個查詢插入到X表中(確定它的插入和輸出到表)。

所以你必須寫3個查詢。


或者您可以使用動態查詢生成SQL語句。

2

不能一步到位做到這一點*

你可以做的是插入一個臨時區域初始查詢到#temp表(或@table變量),然後再插入從表中那裏。包裹的步驟在一個事務中保留ACID:

BEGIN TRAN 

    select name, location, city 
     into #TEMP 
     from mytable; 

    insert into temp1(name, location, city) 
    select name, location, city 
    from #TEMP; 

    -- Same for temp2 and temp3. 

    COMMIT TRAN 

*排除黑客如用觸發器相反-的視圖。

從併發的角度來看,登臺表很重要,因爲如果對源表進行臨時併發更改,重複原始查詢3次可能會導致不同的結果。

0

我不相信你可以在一個語句中插入多個表。但是,您絕對可以在一次交易中完成。

BEGIN TRANSACTION 
    INSERT INTO dbo.temp1 (name, location, city) 
    SELECT name, location, city 
     FROM myTable 
    INSERT INTO dbo.temp2 (name, location, city) 
    SELECT name, location, city 
     FROM myTable2 
COMMIT TRANSACTION 
2

您可以使用輸出做最大2表:

insert into dbo.temp1 (name, location, city) 
output inserted.name, inserted.location, inserted.city into temp2 
select name, location, city from mytable 
0

MySQL不支持多表插入一個INSERT statement。甲骨文是我所知道的唯一一個,奇怪的是......

但是,您可以使用一個交易,並將它們都包含在一個交易中。

的MySQL:

START TRANSACTION; 
    INSERT INTO table1 VALUES ('1','2','3'); 
    INSERT INTO table2 VALUES ('1','2','3'); 
COMMIT; 

SQL服務器:

BEGIN TRAN; 
    INSERT INTO table1 VALUES ('1','2','3'); 
    INSERT INTO table2 VALUES ('1','2','3'); 
COMMIT; 

SQL Server和錯誤捕獲/回滾:

BEGIN TRANSACTION [Tran1] 

    BEGIN TRY 

    INSERT INTO table1 VALUES ('1','2','3')  
    INSERT INTO table2 VALUES ('1','2','3') 


    COMMIT TRANSACTION [Tran1] 

    END TRY 
    BEGIN CATCH 
    ROLLBACK TRANSACTION [Tran1] 
    END CATCH 

GO 
0

可以插入到多個表中使用一個select語句觸發。

CREATE TRIGGER TEMP2_TEMP3_INSERT ON TEMP1 
    AFTER INSERT AS 
BEGIN 
    /* create your insert statements for TEMP2 and TEMP3 here 
    referencing the data from the first insert */ 
END; 
GO 
1

您可以。 有一招。

創建一個視圖,然後創建一個'而不是'觸發器插入到該視圖中插入東西到您的表中。如果您現在插入到您的視圖中,則最終將數據插入3個表格中。這是演示

-- 1. create 3 test tables 
create table t1(id int, f1 varchar(20)) 
create table t2(id int, f2 varchar(20)) 
create table t3(id int, f3 varchar(20)) 
go 

-- 2. create the view 
create view Tt as 
    select t1.ID, t1.f1, t2.f2,t3.f3 
    from t1 
    join t2 on t1.ID=t2.ID 
    join t3 on t1.ID=t3.id 
go 

-- 3. create the trigger 
create trigger Tr_Test on Tt INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    insert into t1 select id,f1 from inserted 
    insert into t2 select id,f2 from inserted 
    insert into t3 select id,f3 from inserted 
END 
GO 

-- 4. now do your insert with a single select 
insert into tt 
    select 1,'A','B','C' 

-- 5. and watch the 3 tables 
select * from t1 
select * from t2 
select * from t3 

voilá,一個插入,3個表被修改。我們不計算隱藏的觸發器,我們;-)