2010-01-10 51 views
4

我建立使用ASP.NET和SQL Server的一个网站上检索的PK,我用使用@@身份

SELECT PK FROM Table WHERE PK = @@identity 

我的问题是,这是更好,更可靠的检索最后插入的PK多用户的网站,使用@@identity或使用本:

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

回答

4

我不知道你想达到什么,但检索连接上的最后一条语句的主键值推荐的方法是使用SCOPE_IDENTITY( )

@@在使用触发器时,身份特别危险,因为它返回最后生成的身份值,包括由语句中的触发器生成的身份值。

MSDN有以下说:

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

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

-1

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

+1

您应该只使用SCOPE_IDENTITY() – gbn 2010-01-10 08:00:57

0

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

4

对于SQL Server 2005及以上...

您可以执行INSERT和使用OUTPUT子句中的一个呼叫SELECT ...

INSERT MyTable (col1, col2, ..., coln) 
OUTPUT INSERTED.keycol, INSERTED.col1, INSERTED.col2, ..., INSERTED.coln 
VALUES (val1, val2, ..., valn) 

否则,你只能使用SCOPE_IDENTITY()

相关问题