大家好我在我的表中有一个Identity列和一个Computed主键列我需要在将记录插入数据库后立即获取最后一个插入的记录,所以我写了以下查询可以有人告诉哪个是最好的选择
SELECT
t.[StudentID]
FROM
[tbl_Student] t
WHERE
t.ID = IDENT_CURRENT('tbl_Student')
另一个使用MAX
如下
Select
MAX(StudentID)
from tbl_Student
从以上两个查询中选择最佳的查询。
答案 0 :(得分:4)
“IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表.IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的标识值。有关详细信息,请参阅IDENT_CURRENT(Transact- SQL)。“
基本上,要返回当前作用域中的最后一个插入,无论是否有任何潜在的触发器或其他会话的插入/删除,都应使用SCOPE_IDENTITY。当然,假设您在与第一个实际插入相同的范围内运行查询。 :)
如果您是,您还可以使用OUTPUT子句将插入的ID值放入表变量/临时表中,并从中进行选择。
答案 1 :(得分:2)
原始答案,我对IDENT_CURRENT
的假设错误。
使用第一个。 IDENT_CURRENT
应该为您提供当前连接的最后一项。如果其他人同时插入另一名学生IDENT_CURRENT
将为两个客户提供正确的价值,而MAX
可能会给您一个错误的价值。
编辑:
正如在其他答案中提到的那样IDENT_CURRENT
和MAX
在并发使用的情况下同样不可靠。我仍然会选择IDENT_CURRENT
,但如果您想获取当前范围或会话使用的最后一个标识,则可以使用函数@@IDENTITY
和SCOPE_IDENTITY
。此technet article解释了IDENT_CURRENT
,@@IDENTITY
和SCOPE_IDENTITY
之间的详细差异。