3

在SQL Server 2005中,我使用存储过程将一行插入到表中,并且我想在插入该行后立即获取新的主键值。我使用下面的方法来获取插入一行之后主键值在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 

--or

select ID from tableTest where testUserEmail [email protected] and testUserName = @testName 

--or

select SCOPE_IDENTITY() as ID 

end 

请建议我哪种方法是更好地进行描述任务。

回答

2

如果你有一个标识列作为主键,你应该使用SCOPE_IDENTITY()

您也可以使用OUTPUT Clause返回ID。

insert into tableTest(testUserEmail,testUserName) 
output inserted.ID 
values (@testValue, @testName) 
5

通过一切手段 - 使用SCOPE_IDENTITY()如果您ID列是INT IDENTITY - ,会给你正确的结果!

如果您有多个客户端几乎同时插入行,MAX(ID)的第一种方法将会失败,因为您会得到错误的结果。不要使用它!

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

此外,作为附注:您应该从不使用sp_作为您的前缀!这是一个微软保留的前缀,在性能方面有缺点 - 使用别的东西。

+1

Thanks marc_s fro reply ... U told“如果您有多个客户端几乎同时插入行,那么使用MAX(ID)的第一种方法将会非常糟糕 - 您将得到错误的结果。那个!“......但是我在脑海里有一个问题,如果多个用户插入的行比sql语句集合中的每个客户端都要分别执行.until过程结束块 –

+2

@Shailesh Sahu:** NO!* *如果你没有任何显式的事务(你不知道),那么'INSERT'语句本身就是一个隐含的事务。一旦运行,其他客户端可以读取这些值 - 如果您有数百个客户端同时插入,则可以保证得到错误的结果......即使您有一个事务 - 其他客户端可能正在读取WITH(NOLOCK)或其他机制,并取回虚假价值.... –