使用@@ identity检索PK

时间:2010-01-10 06:48:14

标签: asp.net sql sql-server tsql identity

我正在使用ASP.NET和SQL Server构建一个网站,我使用

SELECT PK FROM Table WHERE PK = @@identity

我的问题是使用@@identity或使用以下内容检索多用户网站上次插入的PK的更好,更可靠:

SELECT MAX(PK) FROM Table WHERE PK = Session ("UserID")

4 个答案:

答案 0 :(得分:4)

我不确定你想要实现什么,但是建议的方法是检索连接上最后一个语句的主键值是使用SCOPE_IDENTITY()

@@ Identity在使用触发器时特别危险,因为它返回最后生成的标识值,包括从语句流出的触发器生成的标识值。

MSDN有以下说法:

  

SCOPE_IDENTITY和@@ IDENTITY返回   最后的标识值   在当前的任何表中生成   会话。但是,SCOPE_IDENTITY   返回仅在其中插入的值   目前的范围; @@ IDENTITY不是   仅限于特定范围。

您当然应该使用SCOPE_IDENTITY()来支持MAX(PK)方法 - 任何可能的未来更改都可能使此方法无效。

答案 1 :(得分:4)

对于SQL Server 2005及更高版本......

您可以使用OUTPUT子句...

在一次通话中执行INSERT和SELECT
INSERT MyTable (col1, col2, ..., coln)
OUTPUT INSERTED.keycol, INSERTED.col1, INSERTED.col2, ..., INSERTED.coln
VALUES (val1, val2, ..., valn)

否则,您只使用SCOPE_IDENTITY()

答案 2 :(得分:0)

如@David Hall所述,@@IDENTITY关键字返回当前连接最近创建的标识,并不总是查询中最近添加的记录的标识,并且可能返回不正确的值。使用MAX(PK)更有可能出现错误值,我强烈建议不要使用它。为了避免任何竞争条件,我建议您使用SCOPE_IDENTITY()在INSERT SQL语句或存储过程中返回最近添加的记录的标识。

答案 3 :(得分:-1)

取决于你想要完成的事情。如果要将刚刚生成的ID返回到ASP.NET代码(典型场景),那么@@ identity就是您的朋友。在高并发的情况下,mak(PK)甚至不能保证你所追求的PK。