【问题标题】:Get the ID of last inserted records [duplicate]获取最后插入记录的 ID [重复]
【发布时间】:2011-03-16 09:52:12
【问题描述】:

我正在使用以下查询向表中插入多条记录:

INSERT INTO Table1(FirstName, LastName, EmailAddress)
    SELECT t2.FirstName, t2.LastName, t2.EmailAddress
    FROM Table2 t2

由于查询插入多条记录,我无法使用 SCOPE_IDENTITY 检索 PK。有什么方法可以获取最后插入记录的ID吗?

【问题讨论】:

  • 不是重复的,@nawfal - 这个问题是询问如何检索 multiple 插入行的 ID。
  • @Shog9 对,我会删除我的评论..

标签: sql sql-server-2008


【解决方案1】:

SCOPE_IDENTITY() 将正确地为您提供 LAST ID。您需要将它与 @@Rowcount 结合起来,为您提供 ID 范围。 正如其他 Richard 指出的那样,这仅在您的增量设置为 1 时才有效

例如:

declare @last int, @first int
insert ...
select @last = scope_identity(), @first = scope_identity() - @@rowcount + 1

另一种方法(在 SQL Server 2008 中使用它来保证结果) 这样做是使用 OUTPUT 子句

declare @ids table (id int)
INSERT INTO Table1 (FirstName ,LastName ,EmailAddress)
output inserted.id into @ids

-- Get the ids
SELECT id from @Ids

该表现在包含所有插入的 ID

【讨论】:

  • @@rowcount 很有趣。但很明显,它假设增量为 1。我假设它假设插入的交错(例如不同的会话)是不可能的:这可以保证吗?
  • @Richard - 关于增量 1 的要点。我从未使用过任何其他增量。我原以为插入是原子的和顺序的,但有兴趣知道它是否不是
  • 只是测试交错插入:一个会话打开事务并执行第一次插入。然后在第二个会话中进行另一个插入。最后在第一个会话中做另一个插入和提交。来自第二个会话的插入获取 id 2,第一个会话 id 为 1 和 3。使用事务插入的并发会话将交错。我不知道单个多拖车插入是否可以看到这一点,但它看起来是可能的(例如,插入正在从另一个被锁暂时阻塞的表中读取)。 总结:使用OUTPUT或在每次插入后使用SCOPE_IDENTITY一次插入一个。
  • (顺便说一句:使用 SQL Express 2008 R2 进行测试。)
【解决方案2】:

SCOPE_IDENTITY 的文档还列出了 @@IDENTITYIDENT_SCOPE 所有它们(具有关于范围和会话的不同详细信息)返回一个单个标识符。

解决方案:添加一行并获取其标识,然后插入下一行……。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2017-08-24
    • 2020-02-06
    • 2011-03-09
    相关资源
    最近更新 更多