在插入之前和之后存储身份?

时间:2010-11-21 03:11:25

标签: sql sql-server tsql

是否有任何方法可以在插入之前存储标识值,并在插入映射表之后立即存储新的标识值?映射表将用于更新其他表中的外键。

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

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

非常感谢任何帮助。

P.S。是的,我知道我可以通过“保留”身份(插入虚拟行然后删除或DBCC CHECKINDENT)来解决这个问题,将新的“保留”身份和旧身份保存到映射表中,使用新身份更新表格,最后使用INSERT_IDENTITIES打开插件 - 但这很麻烦。

这适用于SQLServer 2008R2。

以下是不起作用的:

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

2 个答案:

答案 0 :(得分:0)

你事先无法知道身份是什么。

OUTPUT子句仅适用于您插入的表,而不适用于源表。我也希望如此:会很有用。

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

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

SELECT
    ID, stuff
FROM
    SomeTable

答案 1 :(得分:0)

可以使用MERGE语句和OUTPUT子句来完成。太糟糕了,没有人回答这个信息,我的同事告诉了我。