使用INSERTED的SQL Server插入语句来获取新ID和现有ID

时间:2010-07-02 16:02:18

标签: sql-server insert identity

我正在将一个sql server db中的记录插入另一个。我需要获取新插入的id并更新源表上的字段。我可以通过INSERTED选项获取新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 个答案:

答案 0 :(得分:5)

你不能用INSERT做它(正弦它缺少自己的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 ;

答案 1 :(得分:1)

将转化ID字段放在表格中。这不会污染表格,它正在正确处理问题。另外,您可以在输出子句中将其取回。而且它也会使更新子表更简单。除非你的开发人员在生产代码中使用Select *,否则我认为没有理由不这样做。