在SQL Server 2005中插入行后的主键值

Sha*_*ahu 3 stored-procedures sql-server-2005 primary-key insert-update

在SQL Server 2005中,我使用存储过程将一行插入表中,我想在插入该行后立即获取新的主键值.我使用以下方法来获取插入行后的主键值

Create Proc Sp_Test
@testEmail varchar(20)=null,-- Should be Unique
@testName varchar(20)=null -- Should be Unique
as

begin

insert into tableTest  (testUserEmail,testUserName)values (@testValue,@testName)

select MAX(ID) from tableTest --ID is Primary Key 
Run Code Online (Sandbox Code Playgroud)

- 要么

select ID from tableTest  where  testUserEmail =@testValue and testUserName = @testName
Run Code Online (Sandbox Code Playgroud)

- 要么

select  SCOPE_IDENTITY() as ID

end
Run Code Online (Sandbox Code Playgroud)

请建议我哪种方法更好地执行所描述的任务.

mar*_*c_s 5

无论如何 - 使用SCOPE_IDENTITY()if你的ID专栏是INT IDENTITY- 只会给你正确的结果!

MAX(ID)如果您有多个客户端几乎同时插入行,那么第一种方法将会非常失败 - 您将得到错误的结果.不要用那个!

如果已存在具有相同电子邮件和名称值的另一个条目,则第三种方法可能会失败.

另外,作为旁注:你永远不应该使用sp_你的前缀!这是一个Microsoft保留的前缀,在性能方面有缺点 - 使用其他东西.

  • @Shailesh Sahu:**NO!**如果你没有任何显式事务(你没有),那么`INSERT`语句本身就是一个隐式事务.一旦运行,其他客户端就可以读取值 - 如果你有数百个客户端同时插入,你肯定会得到错误的结果......即使你有一个交易 - 其他人可能正在阅读`WITH(NOLOCK)`或其他机制,并取回错误的价值.... (2认同)