我正在使用ASP.NET和SQL Server构建一个网站,我使用
SELECT PK FROM Table WHERE PK = @@identity
我的问题是使用@@identity
或使用以下内容检索多用户网站上次插入的PK的更好,更可靠:
SELECT MAX(PK) FROM Table WHERE PK = Session ("UserID")
答案 0 :(得分:4)
我不确定你想要实现什么,但是建议的方法是检索连接上最后一个语句的主键值是使用SCOPE_IDENTITY()
@@ Identity在使用触发器时特别危险,因为它返回最后生成的标识值,包括从语句流出的触发器生成的标识值。
MSDN有以下说法:
SCOPE_IDENTITY和@@ IDENTITY返回 最后的标识值 在当前的任何表中生成 会话。但是,SCOPE_IDENTITY 返回仅在其中插入的值 目前的范围; @@ IDENTITY不是 仅限于特定范围。
您当然应该使用SCOPE_IDENTITY()来支持MAX(PK)方法 - 任何可能的未来更改都可能使此方法无效。
答案 1 :(得分:4)
对于SQL Server 2005及更高版本......
您可以使用OUTPUT子句...
在一次通话中执行INSERT和SELECTINSERT 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。