Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureБаза данных SQL в Microsoft Fabric
Возвращает последнее значение идентификатора, вставленное в столбец идентификаторов в той же области. Областью является модуль, что подразумевает хранимую процедуру, триггер, функцию или пакет. Таким образом, две инструкции принадлежат одной и той же области, если они находятся в одной и той же хранимой процедуре, функции или пакете.
Соглашения о синтаксисе Transact-SQL
Синтаксис
SCOPE_IDENTITY()
Типы возвращаемых данных
numeric(38,0)
Замечания
SCOPE_IDENTITY, IDENT_CURRENT и @@IDENTITY аналогичны функциям, так как они возвращают значения, вставляемые в столбцы удостоверений.
Функция IDENT_CURRENT не ограничена областью действия и сеансом, но ограничена указанной таблицей. Функция IDENT_CURRENT возвращает значение, созданное для указанной таблицы в любом сеансе и области. Дополнительные сведения см. в статье IDENT_CURRENT (Transact-SQL).
SCOPE_IDENTITY и @@IDENTITY возвращают последние значения удостоверений, созданные в любой таблице в текущем сеансе. Однако SCOPE_IDENTITY возвращает значения, вставляемые только в текущую область; @@IDENTITY не ограничивается определенной областью.
Например, существует две таблицы, T1 и T2, и для таблицы T1 определен триггер INSERT. Когда в таблицу T1 вставляется строка, триггер срабатывает и добавляет строку в таблицу T2. В этом сценарии используются две области: вставка в таблицу T1 и вставка триггером в таблицу T2.
Если столбец идентификаторов имеется в обеих таблицах, T1 и T2, функции @@IDENTITY и SCOPE_IDENTITY возвращают разные значения в конце инструкции INSERT в таблице T1. Функция @@IDENTITY возвращает значение столбца идентификаторов, добавленное в текущем сеансе последним во всех областях. Это значение, вставленное в таблицу T2. Функция SCOPE_IDENTITY() возвращает значение IDENTITY, вставленное в таблицу T1. Это было последним добавлением, произошедшим в заданной области. Функция SCOPE_IDENTITY() возвращает значение NULL, если она была вызвана до того, как какая-либо инструкция INSERT была выполнена для столбца идентификаторов в этой области.
Неудачно завершившиеся инструкции и транзакции могут изменить текущий идентификатор таблицы и создать пропуски в значениях столбца идентификаторов. Для значения идентификатора никогда не производится откат, несмотря на то, что транзакция, пытавшаяся вставить в таблицу значение, не была зафиксирована. Например, если инструкция INSERT привела к ошибке из-за нарушения ограничения IGNORE_DUP_KEY, текущее значение идентификатора для таблицы все равно увеличивается.
Примеры
А. Использование @@IDENTITY и SCOPE_IDENTITY с триггерами
В следующем примере показано создание двух таблиц, TZ и TY, и триггера INSERT для таблицы TZ. Когда в таблицу TZ добавляется строка, триггер (Ztrig) срабатывает и добавляет строку в таблицу TY.
USE tempdb;
GO
CREATE TABLE TZ (
Z_id INT IDENTITY(1,1)PRIMARY KEY,
Z_name VARCHAR(20) NOT NULL);
INSERT TZ
VALUES ('Lisa'),('Mike'),('Carla');
SELECT * FROM TZ;
Результирующий набор: вот как выглядит таблица TZ:
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla
CREATE TABLE TY (
Y_id INT IDENTITY(100,5)PRIMARY KEY,
Y_name VARCHAR(20) NULL);
INSERT TY (Y_name)
VALUES ('boathouse'), ('rocks'), ('elevator');
SELECT * FROM TY;
Результирующий набор: вот как выглядит таблица TY:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator
Создайте триггер, вставляющий строку в таблицу TY при вставке строки в таблицу TZ.
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END;
Активируйте триггер и определите значения идентификаторов, полученные с помощью функций @@IDENTITY и SCOPE_IDENTITY.
INSERT TZ VALUES ('Rosalie');
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Вот результирующий набор.
/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`
SCOPE_IDENTITY
4
/*@@IDENTITY returns the last identity value inserted to TY by the trigger.
This fired because of an earlier insert on TZ.*/
@@IDENTITY
115
B. Использование @@IDENTITY и SCOPE_IDENTITY() с репликацией
В следующем примере показано, как использовать системную переменную @@IDENTITY и функцию SCOPE_IDENTITY(), чтобы вставить данные в базу данных, опубликованную для репликации слиянием. Обе таблицы из примера находятся в образце базы данных AdventureWorks2025: таблица Person.ContactType не опубликована, а таблица Sales.Customer опубликована. При репликации слиянием в опубликованные таблицы добавляются триггеры. Таким образом, инструкция @@IDENTITY может возвращать значение из вставки в системную таблицу репликации, а не в пользовательскую таблицу.
Максимальное значение идентификатора в таблице Person.ContactType равно 20. При вставке строки в таблицу @@IDENTITY и SCOPE_IDENTITY() возвращают одно и тоже значение.
USE AdventureWorks2022;
GO
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Вот результирующий набор.
SCOPE_IDENTITY
21
@@IDENTITY
21
Максимальное значение идентификатора в таблице Sales.Customer равно 29483. Если строка вставляется в таблицу, инструкции @@IDENTITY и SCOPE_IDENTITY() возвращают разные значения. Инструкция SCOPE_IDENTITY() возвращает значение из вставки в таблицу пользователя, а инструкция @@IDENTITY — из вставки в системную таблицу репликации. Инструкцию SCOPE_IDENTITY() следует применять для приложений, которым требуется доступ к вставленному значению идентификатора.
INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
Вот результирующий набор.
SCOPE_IDENTITY
29484
@@IDENTITY
89