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

时间:2011-07-23 10:18:50

标签: sql-server-2005 stored-procedures 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 

- 或

select ID from tableTest  where  testUserEmail =@testValue and testUserName = @testName

- 或

select  SCOPE_IDENTITY() as ID

end

请告诉我哪种方法更适合执行所描述的任务。

2 个答案:

答案 0 :(得分:5)

无论如何 - 如果您的SCOPE_IDENTITY()列只有ID - ,那么请使用INT IDENTITY,以便为您提供正确的结果!

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

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

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

答案 1 :(得分:2)

如果您将Identity列作为主键,则应使用SCOPE_IDENTITY()

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

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