【问题标题】:SQL Server insert statement using INSERTED to get new ID and existing IDSQL Server 插入语句使用 INSERTED 获取新 ID 和现有 ID
【发布时间】:2010-07-02 16:02:18
【问题描述】:

我正在将记录从一个 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

【问题讨论】:

    标签: sql-server insert identity


    【解决方案1】:

    你不能用 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 ;
    

    【讨论】:

      【解决方案2】:

      将转换id字段放入表中。这不是污染桌子,而是正确处理问题。另外,您可以在输出子句中将其取回。它还将使更新子表变得更简单。我认为没有理由不这样做,除非您有在生产代码中使用 Select * 的糟糕开发人员。

      【讨论】:

      • 我们正在从数据库生成一个模型,我试图避免采取额外的步骤来不暴露模型上的转换 ID。我认为您的建议可能是处理转换的最合适方式。
      猜你喜欢
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      相关资源
      最近更新 更多