2009-05-06 1 views
2

В том же духе к моему previous question Я снова спрашиваю этих парней за вашу коллективную мудрость и помощь.Верните идентификатор только что добавленного ряда

В хранимой процедуре и после прохождения некоторых проверок мне нужно вставить новую строку и вернуть для нее вновь созданный идентификатор. Проверка того, существует ли строка, работает так, что это бит после этого, который я еще не определил.

Таблица имеет две важные колонки: LocationID и CaseID. CaseID является автоинкрементным, поэтому, когда вы добавляете вставку нового locationid, он автоматически отменяется.

настоящее время у меня это:

-- previous checks for existance of CaseID 

IF @CaseID IS NULL 
BEGIN 
    INSERT INTO 
     Cases(LocationID) 
    VALUES 
     (@LocationID) 

    -- what now? 
END 

Я думал о выполнении @CaseID = (SELECT blah) заявление immeadiately после, но мне было интересно, если есть способ лучше?

Есть ли лучший способ? Как бы вы это сделали?

+0

использовать SET @id = SCOPE_IDENTITY() и забыть о @@ IDENTITY. если у вас есть триггеры в таблице, которые генерируют значения идентификаторов, @@ IDENTITY вернет это значение идентификации, а не оригинальное удостоверение INSERT, но SCOPE_IDENTITY() вернет правильную идентификацию в текущей области. –

ответ

4
SELECT @CaseID = SCOPE_IDENTITY() 

На самом деле, вы можете просто сделать (если это конец хранимой процедуры.):

SELECT SCOPE_IDENTITY() 

(Предложение OUTPUT доступно только в SQL Server 2005 и далее ...)

Ref: SCOPE_IDENTITY

+0

Я не думаю, что это сработает, потому что кажется, что он уже вставил CaseID ранее. Теперь он вставляет идентификатор LocationID, поэтому SCOPE_IDENTITY() возвращает вновь вставленный LocationID, а не идентификатор CaseID. Однако я мог бы не понимать этот вопрос. – Joseph

+0

вы. плакат сказал, что CaseId является столбцом автоматического увеличения ... –

+0

Хорошо, я пытался выяснить, почему он проверял, был ли @CaseID NULL перед выполнением вставки, что не имело для меня большого смысла – Joseph

1

scope_identity()

+1

FYI, есть известная ошибка с Scope_Identity() и @@ IDENTITY: https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811 –

+0

Я просто наткнулся на макрос @@ IDENTITY (?) и реализовал его, как Брэндон Рено сказал, что большинство людей будут использовать его: SET @id = SCOPE_IDENTITY(), или в моем случае SET @id = @@ IDENTITY –

+0

Спасибо за отзыв, KM. Я не знал об этой ошибке. Похоже, мы в безопасности, пока мы используем предложение VALUES в инструкции INSERT? –

0

Вы должны использовать выход Морозу е

http://blog.jemm.net/articles/databases/how-to-using-sql-server-2005s-output-to-return-generated-identity/

... который, как указывалось, доступен только в SQLServer 2005 Plz пренебрежением.

+0

использует SQL Server 2000, который не имеет предложение OUTPUT. –

+0

Ах. Виноват. Я отредактирую соответственно. – PaulJWilliams

1

Как и другие упоминали, SCOPE_IDENTITY() является путь, хотя некоторые ORM инструменты обеспечивают эту функциональность, а также.

Единственное, что вам нужно запомнить, это SCOPE_IDENTITY() вернет последнее значение ключа идентификации, сгенерированное только в течение текущего сеанса. Это полезно при фильтрации новых ключей, которые могли быть созданы другими клиентами одновременно. SELECT @@ IDENTITY вернет последний ключ, сгенерированный любым клиентом/сеансом.

+0

Спасибо, Rich, я не знал об этом :-) – IrishChieftain