2011-04-12 72 views
0

我需要使用插入另一個表後生成的id更新一個表中的列。這是我有:如何在使用插入選擇時基於插入的ID更新列?

tbl1 (id, tbl2id, col1, col2) 
    tbl2 (id, col1, col2) 

    insert into tbl2 
    select col1, col2 
    from tbl1 
    where tbl1.tbl2id is null 

在這一點上我需要用ID來填充tbl1.tbl2id由上述INSERT語句插入的所有行,因此,如果上面的插入語句再次運行,我不會在tbl2中有重複。我在SQL Server 2005.

+0

如果是填充從插入到不同的表數據的表,爲什麼不使用觸發器來執行插入?您將在觸發器的「插入」表中提供所有插入的數據。 – Tony 2011-04-12 22:07:55

+0

我正在修改現有的存儲過程相當長,所以我想知道是否有辦法從存儲介質本身做到這一點。將sproc轉換爲觸發器很容易嗎? – Prabhu 2011-04-12 22:10:08

+0

您可以將觸發器視爲在INSERT,UPDATE或DELETE(或三者的任意組合)之後調用的存儲過程。看看觸發器sql的語法:http://msdn.microsoft.com/en-us/library/ms189799.aspx – Tony 2011-04-12 22:12:11

回答

2

使用OUTPUT子句和一個臨時表。

OUTPUT子句的信息是在這裏:http://msdn.microsoft.com/en-us/library/ms177564.aspx

它應該看起來像:

CREATE TABLE #NewIDs (Tbl1Col1 INT, Tbl2ID INT) 

insert into tbl2 (col1, col2) 
OUTPUT inserted.col1, inserted.id INTO #NewIDs (Tbl1Col1, Tbl2ID) 
    select col1, col2 
    from tbl1 
    where tbl1.tbl2id is null 

UPDATE t 
SET t.tbl2id = tmp.Tbl2ID 
FROM Tbl1 t 
INNER JOIN #NewIDs tmp 
     ON tmp.Tbl1Col1 = t.Col1 

真正的技巧是確保你從表2插入到表2中的一個字段可以用來加入希望它是獨特的,或足夠獨特。唯一真正的複雜情況是表1的ID不是執行INSERT的查詢的一部分,所以它不適用於OUTPUT子句。

+0

你可以在SQL Server 2005上做到這一點嗎? – Prabhu 2011-04-12 22:26:16

+1

@Prabhu:其實你也可以,我也是這麼想的,但是'OUTPUT'關鍵字在2005年可用:http://msdn.microsoft.com/en-us/library/ms177564(v=SQL.90).aspx – Tony 2011-04-12 22:30:55

+0

我不確定我是否有可用於加入的唯一列。 – Prabhu 2011-04-12 22:57:25

0

使用觸發你可以做

CREATE TRIGGER trigger_name 
ON tbl2 
AFTER INSERT 
AS 
    INSERT tbl1 (tbl2id, col1, col2) 
    SELECT id, col1, col2 
    FROM inserted 
+0

Table1沒有被插入到他的場景中,它是Table2。此外,Table1有一個Table2ID列,在這種情況下不會被填充。 – 2011-04-12 22:24:58

+0

@srutzky:謝謝,我把桌子弄錯了。編輯了我的答案。 – Tony 2011-04-12 22:27:42

+0

@Tony,所以我可以保留我的存儲過程,只是引入這個觸發器?所以插入發生在我的存儲過程後,這個觸發器會自動更新我的表? – Prabhu 2011-04-12 22:32:30