В чем разница между Scope Identity(), Identity(), @@Identity и Ident Current()?
Я знаю Scope_Identity(),Identity(),@@Identity и Ident_Current() все получают значение столбца идентификаторов, но я хотел бы знать разницу.
часть спора, который у меня есть, - это то, что они подразумевают под областью действия применительно к этим функциям выше?
Я также хотел бы простой пример различных сценариев их использования?
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вернет идентификатор из вставки в триггер (alog_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