Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к: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, и INSERT триггер определяется на T1. Когда в таблицу 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