使用insert select时如何根据插入的id更新列?

时间:2011-04-12 22:05:03

标签: .net sql sql-server sql-server-2005 tsql

我需要使用在插入另一个表后生成的ID更新一个表中的列。这就是我所拥有的:

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

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

此时我需要使用上面的insert语句插入的所有行的id填充tbl1.tbl2id,这样如果再次运行上面的insert语句,我将不会在tbl2中重复。我在SQL Server 2005上。

2 个答案:

答案 0 :(得分: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

真正的诀窍是确保您从Table2插入Table2的其中一个字段可以用于JOIN,因此希望它是唯一的,或者足够独特。唯一真正的复杂因素是表1的ID不是执行INSERT的查询的一部分,因此它不可用于OUTPUT子句。

答案 1 :(得分:0)

使用触发器可以

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