Получить ПК, используя @@ identity - PullRequest
4 голосов
/ 10 января 2010

Я создаю веб-сайт с использованием ASP.NET и SQL Server и использую

SELECT PK FROM Table WHERE PK = @@identity

Мой вопрос заключается в том, какой способ лучше и надежнее получить последний вставленный PK для многопользовательского веб-сайта, используя @@identity или используя это:

SELECT MAX(PK) FROM Table WHERE PK = Session ("UserID")

Ответы [ 4 ]

4 голосов
/ 10 января 2010

Для SQL Server 2005 и выше ...

Вы можете сделать INSERT и SELECT за один вызов, используя предложение OUTPUT ...

INSERT MyTable (col1, col2, ..., coln)
OUTPUT INSERTED.keycol, INSERTED.col1, INSERTED.col2, ..., INSERTED.coln
VALUES (val1, val2, ..., valn)

В противном случае вы используете только SCOPE_IDENTITY ()

4 голосов
/ 10 января 2010

Я не совсем уверен, чего именно вы хотите достичь, но рекомендуемый способ получения значения первичного ключа последнего оператора в соединении - это использование SCOPE_IDENTITY ()

@@ Идентичность особенно опасна, когда вы используете триггеры, поскольку она возвращает последнее сгенерированное значение идентификатора, включая значения, сгенерированные триггерами, вытекающими из оператора.

MSDN говорит следующее:

SCOPE_IDENTITY и @@ IDENTITY возвращаются последние значения идентичности, которые генерируется в любой таблице в текущем сессия. Тем не менее, SCOPE_IDENTITY возвращает значения, вставленные только в текущая область; @@ IDENTITY не является ограничено определенной областью применения.

Вам, безусловно, следует использовать SCOPE_IDENTITY () в пользу подхода MAX (PK) - любое количество возможных будущих изменений может лишить законной силы этот метод.

0 голосов
/ 10 января 2010

Как упомянул @David Hall, ключевое слово @@IDENTITY возвращает самую последнюю созданную идентификационную информацию для вашего текущего соединения, а не всегда идентификацию для недавно добавленной записи в вашем запросе и может возвращать неверное значение. Использование MAX(PK) повышает вероятность неправильного значения, и я настоятельно рекомендую не использовать его. Чтобы избежать каких-либо условий гонки, я бы предложил вам использовать SCOPE_IDENTITY() для возврата идентификатора недавно добавленной записи в инструкции SQL INSERT или хранимой процедуре.

0 голосов
/ 10 января 2010

Зависит от того, что вы пытаетесь достичь. Если вы хотите вернуть только что созданный идентификатор в код ASP.NET (типичный сценарий), тогда @@ identity - ваш друг. В ситуации с высоким уровнем параллелизма мак (PK) даже не гарантированно будет ПК, к которому вы стремитесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...