SQL SERVER 2008 获取最后插入的值

Posted

技术标签:

【中文标题】SQL SERVER 2008 获取最后插入的值【英文标题】:SQL SERVER 2008 GET LAST INSERTED VALUES 【发布时间】:2012-09-25 11:21:27 【问题描述】:

这是我的桌子。

Ticket(id int auto_increment,name varchar(50));

插入此表后,我想将 id 和 name 发送到邮件.. 我怎样才能得到最后插入的值。

帮助解决这个问题...

【问题讨论】:

【参考方案1】:

查看:Scope_identity

SCOPE_IDENTITY()

我们可以从该表中获得最后插入的记录id的具有Identity属性的表将是这样的

SELECT SCOPE_IDENTITY()

但这不是一个安全的技术:

SELECT MAX(Id) FROM Ticket

这也不是一个安全的技术:

SELECT TOP 1 Id FROM Ticket ORDER BY Id DESC

【讨论】:

您的第二个和第三个建议在并发条件下并不安全。 这会起作用,但是当同时在表中插入多个条目时会出现问题。例如,在您获取记录时,在中间插入了另一条记录,那么您将不会得到正确的结果,所以这是在并发的情况下......希望现在你清楚......:)......@DavidA跨度> 【参考方案2】:

您应该使用SCOPE_IDENTITY() 来获取表中最后插入的主键值。我想它应该是ID 值。获得后,使用此 ID 执行 SELECT 即可。

还有@@IDENTITY,但使用其中一个或另一个可能会导致值不准确。

查看这些详细文章以获得更多见解、如何使用它们的详细说明、它们为何不同以及一些演示代码:

For the last time, NO, you can't trust IDENT_CURRENT()

sql server identity vs scope_identity vs ident_current retrieve last inserted identity of record

【讨论】:

【参考方案3】:

对于 2008 R2 Service Pack 1 (Link) 之前的 SQL Server:

使用 SCOPE_IDENTITY() 和 @@身份

在这种情况下,OUTPUT 子句是最安全的机制:

DECLARE @InsertedRows AS TABLE (Id int)
DECLARE @NewId AS INT
INSERT INTO HumanResources.Employees
  ( /* column names */)
OUTPUT Inserted.Id INTO @InsertedRows
  VALUES (/* column values */)
SELECT @NewId = Id FROM @InsertedRows

【讨论】:

事务中是否需要这样做?【参考方案4】:

在您的表中添加自动增量字段,例如....索引(INT,AUTO INCREEMENT) 然后在插入或完成任何操作之前通过获取 max(index) 来获取最后一条记录

【讨论】:

请修正语法,让人们理解并尝试您的建议。

以上是关于SQL SERVER 2008 获取最后插入的值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 触发器:检查插入的值

检索sql server中新插入行的值

如何使用 Sql Server 2008 获取用于插入到 select 中的 scope_identity 列表?

Sql Server 2008 MERGE - 获取计数的最佳方式

SQL Server事务回滚对自增键的影响

插入期间表被锁定...网站无法使用(sql server 2008)