【问题标题】:Store identity before and after an insert?在插入之前和之后存储身份?
【发布时间】:2011-02-07 12:32:55
【问题描述】:

有没有办法存储插入之前的标识值和插入映射表之后的新标识值?映射表将用于更新其他表中的外键。

最初我认为这可以通过 OUTPUT INTO 子句实现,但只有插入的值是可插入的。我不确定如何单独使用 OUTPUT 子句来完成这项工作。也许是某种子查询?

也许这太复杂了,有一种方法可以使用 SCOPE_IDENTITY 和子查询来做到这一点。

任何帮助将不胜感激。

附言是的,我知道我可以通过“保留”身份(插入虚拟行然后删除或 DBCC CHECKINDENT)来解决这个问题,将新的“保留”身份和旧身份保存到映射表中,用新身份更新表,最后在打开 INSERT_IDENTITIES 的情况下进行插入 - 但这很混乱。

这适用于 SQLServer 2008R2。

以下是行不通的:

INSERT 
    [SomeTable]
    OUTPUT
           INSERTED.[Id],
           [Id] -- This doesn't work
        INTO
           [#mappingTable]
SELECT
    (SomeColumns)
FROM
    [#someOtherTable];

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您无法提前知道身份将是什么。

    并且 OUTPUT 子句仅适用于您插入的表,而不适用于源表。我也希望这样做:会很有用。

    因此,您只能重新查询 INSERTed 表(如下所示)或 UPDATE #mappingTable

    INSERT 
        [SomeTable]
    SELECT
        (SomeColumns)
    FROM
        [#someOtherTable];
    
    SELECT
        ID, stuff
    FROM
        SomeTable
    

    【讨论】:

    • 太糟糕了,这不能通过对映射表进行 UPDATE 来完成,它的 CTE 执行插入操作并具有返回新标识的 OUTPUT 子句?
    【解决方案2】:

    可以使用 MERGE 语句和 OUTPUT 子句来完成。可惜没有人回答这个信息,不过我的同事给我看了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-26
      • 2011-01-17
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多