SCOPE_IDENTITY (Transact-SQL)SCOPE_IDENTITY (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Возвращает последнее значение идентификатора, вставленное в столбец идентификаторов в той же области.Returns the last identity value inserted into an identity column in the same scope. Областью является модуль, что подразумевает хранимую процедуру, триггер, функцию или пакет.A scope is a module: a stored procedure, trigger, function, or batch. Таким образом, две инструкции принадлежат одной и той же области, если они находятся в одной и той же хранимой процедуре, функции или пакете.Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

SCOPE_IDENTITY()  

Типы возвращаемых данныхReturn Types

numeric(38,0)numeric(38,0)

RemarksRemarks

Функции SCOPE_IDENTITY, IDENT_CURRENT и @@IDENTITY идентичны друг другу, так как возвращают значения, вставленные в столбцы идентификаторов.SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions because they return values that are inserted into identity columns.

Функция IDENT_CURRENT не ограничена областью действия и сеансом, но ограничена указанной таблицей.IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. Функция IDENT_CURRENT возвращает значение, созданное для указанной таблицы в любом сеансе и области.IDENT_CURRENT returns the value generated for a specific table in any session and any scope. Дополнительные сведения см. в статье IDENT_CURRENT (Transact-SQL).For more information, see IDENT_CURRENT (Transact-SQL).

Функции SCOPE_IDENTITY и @@IDENTITY возвращают последние значения идентификатора, созданные в любой таблице во время текущего сеанса.SCOPE_IDENTITY and @@IDENTITY return the last identity values that are generated in any table in the current session. Однако функция SCOPE_IDENTITY возвращает значения, вставленные только в рамках текущей области, тогда как действие функции @@IDENTITY не ограничивается никакими областями.However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

Например, существует две таблицы, T1 и T2, и для таблицы T1 определен триггер INSERT.For example, there are two tables, T1 and T2, and an INSERT trigger is defined on T1. Когда в таблицу T1 вставляется строка, триггер срабатывает и добавляет строку в таблицу T2.When a row is inserted to T1, the trigger fires and inserts a row in T2. В этом сценарии используются две области: вставка в таблицу T1 и вставка триггером в таблицу T2.This scenario illustrates two scopes: the insert on T1, and the insert on T2 by the trigger.

При условии, что столбец идентификаторов имеется в обеих таблицах, T1 и T2, функции @@IDENTITY и SCOPE_IDENTITY вернут разные значения в конце инструкции INSERT в таблице T1.Assuming that both T1 and T2 have identity columns, @@IDENTITY and SCOPE_IDENTITY return different values at the end of an INSERT statement on T1. Функция @@IDENTITY возвращает значение столбца идентификаторов, добавленное в текущем сеансе последним во всех областях.@@IDENTITY returns the last identity column value inserted across any scope in the current session. Это значение, вставленное в таблицу T2.This is the value inserted in T2. Функция SCOPE_IDENTITY() возвращает значение IDENTITY, вставленное в таблицу T1.SCOPE_IDENTITY() returns the IDENTITY value inserted in T1. Это было последним добавлением, произошедшим в заданной области.This was the last insert that occurred in the same scope. Функция SCOPE_IDENTITY() возвращает значение NULL, если она была вызвана до того, как какая-либо инструкция INSERT была выполнена для столбца идентификаторов в этой области.The SCOPE_IDENTITY() function returns the null value if the function is invoked before any INSERT statements into an identity column occur in the scope.

Неудачно завершившиеся инструкции и транзакции могут изменить текущий идентификатор таблицы и создать пропуски в значениях столбца идентификаторов.Failed statements and transactions can change the current identity for a table and create gaps in the identity column values. Для значения идентификатора никогда не производится откат, несмотря на то, что транзакция, пытавшаяся вставить в таблицу значение, не была зафиксирована.The identity value is never rolled back even though the transaction that tried to insert the value into the table is not committed. Например, если инструкция INSERT привела к ошибке из-за нарушения ограничения IGNORE_DUP_KEY, текущее значение идентификатора для таблицы все равно увеличивается.For example, if an INSERT statement fails because of an IGNORE_DUP_KEY violation, the current identity value for the table is still incremented.

ПримерыExamples

A.A. Использование функций @@IDENTITY и SCOPE_IDENTITY с триггерамиUsing @@IDENTITY and SCOPE_IDENTITY with triggers

В следующем примере показано создание двух таблиц, TZ и TY, и триггера INSERT для таблицы TZ.The following example creates two tables, TZ and TY, and an INSERT trigger on TZ. Когда в таблицу TZ добавляется строка, триггер (Ztrig) срабатывает и добавляет строку в таблицу TY.When a row is inserted to table TZ, the trigger (Ztrig) fires and inserts a row in 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:Result set: This is how table TZ looks.

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:Result set: This is how TY looks:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

Создайте триггер, вставляющий строку в таблицу TY при вставке строки в таблицу TZ.Create the trigger that inserts a row in table TY when a row is inserted in table TZ.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

Активируйте триггер и определите значения идентификаторов, полученные с помощью функций @@IDENTITY и SCOPE_IDENTITY.FIRE the trigger and determine what identity values you obtain with the @@IDENTITY and SCOPE_IDENTITY functions.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Результирующий набор:Here is the result set.

/*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() с репликациейUsing @@IDENTITY and SCOPE_IDENTITY() with replication

В следующем примере показано, как использовать системную переменную @@IDENTITY и функцию SCOPE_IDENTITY(), чтобы вставить данные в базу данных, опубликованную для репликации слиянием.The following examples show how to use @@IDENTITY and SCOPE_IDENTITY() for inserts in a database that is published for merge replication. Обе таблицы из примера находятся в образце базы данных AdventureWorks2012AdventureWorks2012: таблица Person.ContactType не опубликована, а таблица Sales.Customer опубликована.Both tables in the examples are in the AdventureWorks2012AdventureWorks2012 sample database: Person.ContactType is not published, and Sales.Customer is published. При репликации слиянием в опубликованные таблицы добавляются триггеры.Merge replication adds triggers to tables that are published. Таким образом, инструкция @@IDENTITY может возвращать значение из вставки в системную таблицу репликации, а не в пользовательскую таблицу.Therefore, @@IDENTITY can return the value from the insert into a replication system table instead of the insert into a user table.

Максимальное значение идентификатора в таблице Person.ContactType равно 20.The Person.ContactType table has a maximum identity value of 20. При вставке строки в таблицу @@IDENTITY и SCOPE_IDENTITY() возвращают одно и тоже значение.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return the same value.

USE AdventureWorks2012;  
GO  
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Результирующий набор:Here is the result set.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Максимальное значение идентификатора в таблице Sales.Customer равно 29483.The Sales.Customer table has a maximum identity value of 29483. Если строка вставляется в таблицу, инструкции @@IDENTITY и SCOPE_IDENTITY() возвращают разные значения.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return different values. Инструкция SCOPE_IDENTITY() возвращает значение из вставки в таблицу пользователя, а инструкция @@IDENTITY  — из вставки в системную таблицу репликации.SCOPE_IDENTITY() returns the value from the insert into the user table, whereas @@IDENTITY returns the value from the insert into the replication system table. Инструкцию SCOPE_IDENTITY() следует применять для приложений, которым требуется доступ к вставленному значению идентификатора.Use SCOPE_IDENTITY() for applications that require access to the inserted identity value.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

Результирующий набор:Here is the result set.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

См. также:See Also

@@IDENTITY (Transact-SQL)@@IDENTITY (Transact-SQL)