В чем разница между Scope Identity(), Identity(), @@Identity и Ident Current()?



Я знаю Scope_Identity(),Identity(),@@Identity и Ident_Current() все получают значение столбца идентификаторов, но я хотел бы знать разницу.



часть спора, который у меня есть, - это то, что они подразумевают под областью действия применительно к этим функциям выше?



Я также хотел бы простой пример различных сценариев их использования?

806   8  

8 ответов:

  • The @@identity функция возвращает последнее удостоверение, созданное в том же сеансе.
  • The scope_identity() функция возвращает последнее удостоверение, созданное в том же сеансе и той же области.
  • The ident_current(name) возвращает последнее удостоверение, созданное для определенной таблицы или представления в любом сеансе.
  • The identity() функция не используется для получения удостоверения, она используется для создания удостоверения в select...into запрос.

сессия является подключение базы данных. Область действия-это текущий запрос или текущая хранимая процедура.

ситуация, когда scope_identity() и @@identity функции отличаются, если у вас есть триггер на таблице. Если у вас есть запрос, который вставляет запись, вызывая триггер, чтобы вставить другую запись где-то,scope_identity() функция вернет идентификатор, созданный запросом, в то время как @@identity функция вернет идентификатор, созданный триггером.

так, обычно используйте

хороший вопрос.

  • @@IDENTITY: возвращает последнее значение идентификатора, сгенерированное в вашем соединении SQL (SPID). Большую часть времени это будет то, что вы хотите, но иногда это не так (например, когда триггер срабатывает в ответ на INSERT, и триггер выполняет другой INSERT заявления).

  • SCOPE_IDENTITY(): возвращает последнее значение идентификатора, сгенерированное в текущей области (т. е. хранимая процедура, триггер, функция, прием.)

  • IDENT_CURRENT(): возвращает последнее значение идентификатора для конкретной таблицы. Не используйте это, чтобы получить значение идентификатора из INSERT, Это зависит от условий гонки (т. е. несколько соединений вставке строк в таблице).

  • IDENTITY(): используется при объявлении столбца в таблице в качестве столбца идентификаторов.

для получения дополнительной информации, см.: http://msdn.microsoft.com/en-us/library/ms187342.aspx.

подводя итог: если вы вставляете строки, и вы хотите знать значение столбца идентификаторов для строки вы просто вставлен, всегда используйте SCOPE_IDENTITY().

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

очень приятно блоге Адам Андерсон описывает эту разницу:

сессии означает текущее соединение, которое выполняет команду.

Scope означает непосредственный контекст команды. Каждый вызов хранимой процедуры выполняется в своей области видимости, а вложенные вызовы выполнение во вложенной области в области вызывающей процедуры. Аналогично, команда SQL, выполняемая из приложения или SSMS, выполняется в своей собственной области, и если эта команда запускает какие-либо триггеры, каждый триггер выполняется в своей собственной вложенной области.

таким образом, различия между тремя методами поиска идентичности заключаются в следующем:

@@identity возвращает последнее значение идентификатора, сформированное в этой сессии, но любой масштаб.

scope_identity() возвращает последнее значение идентификатора, сформированное в этой сессии этой объем.

ident_current() возвращает последнее значение идентификатора, созданное для конкретной таблицы в любой сессии любой объем.

Scope означает контекст кода, который выполняет INSERT сообщении SCOPE_IDENTITY(), в отличие от глобальной области @@IDENTITY.

CREATE TABLE Foo(
  ID INT IDENTITY(1,1),
  Dummy VARCHAR(100)
)

CREATE TABLE FooLog(
  ID INT IDENTITY(2,2),
  LogText VARCHAR(100)
)
go
CREATE TRIGGER InsertFoo ON Foo AFTER INSERT AS
BEGIN
  INSERT INTO FooLog (LogText) VALUES ('inserted Foo')
  INSERT INTO FooLog (LogText) SELECT Dummy FROM inserted
END

INSERT INTO Foo (Dummy) VALUES ('x')
SELECT SCOPE_IDENTITY(), @@IDENTITY 

дает разные результаты.

из-за ошибки, упомянутой @David Freitas и из-за несовместимости с новой функцией последовательности, которая была введена в 2012 году, я бы рекомендовал держаться подальше от всех трех из них. Вместо этого, вы можете использовать предложение output, чтобы получить значение идентификатора, вставленное. Другим преимуществом является то, что вывод даже работает, если вы вставили более одной строки.

подробности и примеры смотрите здесь:Кризис

чтобы прояснить проблему с @@Identity:

например, если вы вставляете таблицу, и эта таблица имеет триггеры, выполняющие вставки,@@Identity вернет идентификатор из вставки в триггер (a log_id или что-то), в то время как scope_identity() вернет идентификатор из вставки в исходную таблицу.

так что если у вас нет никаких триггеров,scope_identity() и @@identity вернет то же значение. Если у вас есть триггеры, вам нужно подумать о том, какое значение вы хотели бы.

вот еще одно хорошее объяснение от книги:

Что касается разницы между SCOPE_IDENTITY и @ @ IDENTITY, предположим, что у вас есть хранимая процедура P1 с тремя операторами:
- Вставка, которая генерирует новое значение идентификатора
- Вызов хранимой процедуры P2, которая также имеет инструкцию INSERT, которая генерирует новое значение идентификатора
- Оператор, который запрашивает функции SCOPE_IDENTITY и @ @ IDENTITY Этот Функция SCOPE_IDENTITY возвращает значение, сгенерированное P1 (тот же сеанс и область). Функция @ @ IDENTITY возвращает значение, сгенерированное P2 (один и тот же сеанс независимо от области действия).

Scope Identity: идентификатор последней записи, добавленной в выполняемую хранимую процедуру.

@@Identity: идентификатор последней записи, добавленной в пакет запроса, или в результате запроса, например, процедура, которая выполняет вставку, затем запускает триггер, который затем вставляет запись, вернет идентификатор вставленной записи из триггера.

IdentCurrent: последний идентификатор, выделенный для таблицы.

Comments

    Ничего не найдено.