代码之家  ›  专栏  ›  技术社区  ›  Steve

使用inserted获取新ID和现有ID的SQL Server insert语句

  •  5
  • Steve  · 技术社区  · 15 年前

    我正在将一个SQL Server数据库中的记录插入到另一个数据库中。我需要获取新插入的ID并更新源表上的字段。我可以用插入的选项获得新的ID。没问题。但是,我似乎无法从源表中获取ID。目标表没有用于源ID的字段。源表是转换表,我不想用转换字段污染目标表。这可能是不可能的,但我想我先和你们确认一下。

    drop table #Table1
    CREATE TABLE #Table1
    (
        Table1ID INT,
        Table2ID INT,
        NAME VARCHAR(32)
    )
    
    INSERT INTO #Table1
    VALUES 
          (1, NULL, 'Fred')
         ,(2, NULL, 'Tom')
         ,(3, NULL, 'Sally')     
    
    --ok, im inserting into #Table2
    drop table #Table2
    CREATE TABLE #Table2
    (
        [Table2ID] [int] IDENTITY(1,1) NOT NULL,
        NAME VARCHAR(32)
    )
    
    --THE RUB, I want to insert Table2ID into table3 
    --along with Table1ID. I cannot seem to reference table1
    --Any Ideas?
    insert into #Table2(NAME)
    OUTPUT INSERTED.Table2ID, T.Table1ID into #Table3
    select Name from #Table1 T
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Remus Rusanu    15 年前

    您不能用insert(sine它本身缺少一个from子句)来完成它,但是您可以用merge来完成它:

    MERGE INTO #Table2 as t2
    USING #Table1 as t1 ON 0=1
    WHEN NOT MATCHED BY TARGET THEN 
        INSERT (NAME) VALUES (t1.NAME)
    OUTPUT INSERTED.Table2ID, t1.Table1ID ;
    
        2
  •  1
  •   HLGEM    15 年前

    将转换ID字段放入表中。这不会污染桌子,而是正确地处理问题。另外,您可以在output子句中把它取出来。它还可以简化子表的更新。我认为没有任何理由不这样做,除非您的开发人员在生产代码中使用了select*。

    推荐文章