Sql server 2008 获取sql server中最后一条插入记录的最佳方法
大家好,我的表中有一个标识列和一个计算主键列,我需要在将记录插入数据库后立即获取最后一条插入的记录,所以我编写了以下查询,有人能告诉我哪条是最好的选择吗Sql server 2008 获取sql server中最后一条插入记录的最佳方法,sql-server-2008,Sql Server 2008,大家好,我的表中有一个标识列和一个计算主键列,我需要在将记录插入数据库后立即获取最后一条插入的记录,所以我编写了以下查询,有人能告诉我哪条是最好的选择吗 SELECT t.[StudentID] FROM [tbl_Student] t WHERE t.ID = IDENT_CURRENT('tbl_Student') 另一种是使用MAX,如下所示 Select MAX(StudentID) from tbl_Student 从以上两个问题中,哪一个是最好的选择。原始答案,其中我关于ID
SELECT
t.[StudentID]
FROM
[tbl_Student] t
WHERE
t.ID = IDENT_CURRENT('tbl_Student')
另一种是使用MAX
,如下所示
Select
MAX(StudentID)
from tbl_Student
从以上两个问题中,哪一个是最好的选择。原始答案,其中我关于
IDENT_CURRENT
的假设有误
使用第一个IDENT_CURRENT
应为您提供当前连接的最后一项。如果其他人同时插入另一个学生,IDENT_CURRENT
将为两个客户端提供正确的值,而MAX
可能会为您提供错误的值
编辑:
正如在另一个答案中提到的,IDENT_CURRENT
和MAX
在同时使用的情况下同样不可靠。我仍然会选择IDENT\u CURRENT
,但是如果要获取当前作用域或会话使用的最后一个标识,可以使用函数@@identity
和scope\u identity
。这解释了IDENT_CURRENT
、@@IDENTITY
和SCOPE_IDENTITY
MAX之间的详细区别,根据technet,它们的行为基本相同,而且两者同样不可靠
IDENT_CURRENT不受作用域和会话的限制;它仅限于指定的表。IDENT_CURRENT返回在任何会话和任何作用域中为特定表生成的标识值。有关详细信息,请参阅IDENT_CURRENT(Transact-SQL)
基本上,要返回当前范围内的最后一次插入,不管是否有任何潜在的触发器或其他会话的插入/删除,都应该使用scope\u IDENTITY。当然,这是假设您首先在与实际插入相同的范围内运行查询。:)
如果是,您也可以选择简单地使用OUTPUT子句将插入的ID值获取到表变量/临时表中,并从中进行选择。您可能想要刚才插入的记录,它不一定与“上次插入的记录”相同。没有有限的作用域,它返回在任何会话中为特定表生成的最后一条插入记录。