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 获取用于插入到 select 中的 scope_identity 列表?