Значение первичного ключа после вставки строки в SQL Server 2005 - PullRequest
3 голосов
/ 23 июля 2011

В 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 ]

5 голосов
/ 23 июля 2011

Во что бы то ни стало - используйте SCOPE_IDENTITY(), если столбец ID имеет значение INT IDENTITY - только , что даст вам правильные результаты!

Первый подход с MAX(ID) ужасно потерпит неудачу, если у вас есть несколько клиентов, вставляющих строки почти одновременно - вы получите ложные результаты обратно. Не используйте это!

Третий подход может потерпеть неудачу, если другая запись с такими же значениями для E-Mail и имени уже существует.

Кроме того, как примечание: вы не должны никогда использовать sp_ в качестве префикса! Это зарезервированный Microsoft префикс, имеющий недостатки с точки зрения производительности - используйте что-то другое.

2 голосов
/ 23 июля 2011

Если у вас есть столбец Identity в качестве первичного ключа, вы должны использовать SCOPE_IDENTITY()

Вы также можете использовать предложение OUTPUT для возврата идентификатора.

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