Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 获取sql server中最后一条插入记录的最佳方法_Sql Server 2008 - Fatal编程技术网

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值获取到表变量/临时表中,并从中进行选择。

您可能想要刚才插入的记录,它不一定与“上次插入的记录”相同。没有有限的作用域,它返回在任何会话中为特定表生成的最后一条插入记录。