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

CETTE RUBRIQUE S’APPLIQUE À :ouiSQL Server (à partir de la version 2008)ouiAzure SQL DatabasenonAzure SQL Data Warehouse nonParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Renvoie la dernière valeur d'identité insérée dans une colonne d'identité dans la même étendue.Returns the last identity value inserted into an identity column in the same scope. Une étendue est un module : procédure stockée, déclencheur, fonction ou lot.A scope is a module: a stored procedure, trigger, function, or batch. Par conséquent, si les deux instructions sont dans la même procédure stockée, une fonction ou un lot, ils sont dans la même portée.Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

SCOPE_IDENTITY()  

Types de retourReturn Types

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

NotesRemarks

SCOPE_IDENTITY, IDENT_CURRENT et @@IDENTITY sont des fonctions similaires car elles retournent des valeurs qui sont insérées dans les colonnes d’identité.SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions because they return values that are inserted into identity columns.

IDENT_CURRENT n'est pas limitée par l'étendue et par la session ; elle est limitée à une table spécifiée.IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT renvoie la valeur générée pour une table spécifique dans n'importe quelle session et n'importe quelle étendue.IDENT_CURRENT returns the value generated for a specific table in any session and any scope. Pour plus d’informations, consultez IDENT_CURRENT ( Transact-SQL ) .For more information, see IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY et @@IDENTITY retourner les dernières valeurs d’identité générées dans n’importe quelle table dans la session active.SCOPE_IDENTITY and @@IDENTITY return the last identity values that are generated in any table in the current session. Toutefois, SCOPE_IDENTITY renvoie les valeurs insérées uniquement dans la portée actuelle ; @@IDENTITY n’est pas limité à une étendue spécifique.However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

Par exemple, deux tables T1 et T2 et un déclencheur INSERT sont définis sur T1.For example, there are two tables, T1 and T2, and an INSERT trigger is defined on T1. Lorsqu'une ligne est insérée dans T1, le déclencheur est activé et insère une ligne dans T2.When a row is inserted to T1, the trigger fires and inserts a row in T2. Ce scénario met en œuvre deux étendues : l'insertion dans T1 et l'insertion dans T2 par le déclencheur.This scenario illustrates two scopes: the insert on T1, and the insert on T2 by the trigger.

En supposant que T1 et T2 contient des colonnes d’identité, @@IDENTITY et SCOPE_IDENTITY renvoient des valeurs différentes à la fin d’une instruction INSERT dans 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 renvoie la dernière valeur de colonne d’identité insérée dans toute étendue dans la session active.@@IDENTITY returns the last identity column value inserted across any scope in the current session. Il s'agit de la valeur insérée dans T2.This is the value inserted in T2. SCOPE_IDENTITY() renvoie la valeur IDENTITY insérée dans T1.SCOPE_IDENTITY() returns the IDENTITY value inserted in T1. Il s'agit de la dernière insertion qui s'est produite dans la même étendue.This was the last insert that occurred in the same scope. La fonction SCOPE_IDENTITY() renvoie la valeur null si la fonction est appelée avant toute instruction INSERT dans une colonne d’identité se produire dans l’étendue.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.

Les instructions et les transactions en échec peuvent modifier l'identité actuelle d'une table et créer des trous dans les valeurs des colonnes d'identité.Failed statements and transactions can change the current identity for a table and create gaps in the identity column values. La valeur d'identité n'est jamais annulée, même si la transaction qui a essayé d'insérer la valeur dans la table n'est pas validée.The identity value is never rolled back even though the transaction that tried to insert the value into the table is not committed. Par exemple, si une instruction INSERT échoue à cause d'une violation d'identité IGNORE_DUP_KEY, la valeur d'identité actuelle de la table augmente quand même d'une unité.For example, if an INSERT statement fails because of an IGNORE_DUP_KEY violation, the current identity value for the table is still incremented.

ExemplesExamples

A.A. À l’aide de@IDENTITY et SCOPE_IDENTITY avec des déclencheursUsing @@IDENTITY and SCOPE_IDENTITY with triggers

L'exemple suivant crée deux tables, TZ et TY, ainsi qu'un déclencheur INSERT sur TZ.The following example creates two tables, TZ and TY, and an INSERT trigger on TZ. Lorsqu'une ligne est insérée dans la table TZ, le déclencheur (Ztrig) est activé et insère une ligne dans 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;  

Jeu de résultats : Voici à quoi ressemble la table 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;  

Jeu de résultats : Voici à quoi ressemble TY :Result set: This is how TY looks:

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

Créez le déclencheur qui insère une ligne dans la table TY lorsqu’une ligne est insérée dans la table 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;  

Activer le déclencheur et que vous obtenez avec les valeurs identité le @@IDENTITY et SCOPE_IDENTITY fonctions.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  

Voici l'ensemble des résultats.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.B. À l’aide de@IDENTITY et SCOPE_IDENTITY() avec la réplicationUsing @@IDENTITY and SCOPE_IDENTITY() with replication

Les exemples suivants indiquent comment utiliser @@IDENTITY et SCOPE_IDENTITY() pour des insertions dans une base de données qui est publiée pour la réplication de fusion.The following examples show how to use @@IDENTITY and SCOPE_IDENTITY() for inserts in a database that is published for merge replication. Les deux tables mentionnées à titre d'exemple appartiennent à la base de données exemple AdventureWorks2012AdventureWorks2012 : Person.ContactType n'est pas publiée et Sales.Customer est publiée.Both tables in the examples are in the AdventureWorks2012AdventureWorks2012 sample database: Person.ContactType is not published, and Sales.Customer is published. La réplication de fusion ajoute des déclencheurs aux tables qui sont publiées.Merge replication adds triggers to tables that are published. Par conséquent, @@IDENTITY peut retourner la valeur de l'insertion dans une table système de réplication au lieu de l'insertion dans une table utilisateur.Therefore, @@IDENTITY can return the value from the insert into a replication system table instead of the insert into a user table.

Le Person.ContactType table possède une valeur d’identité maximale de 20.The Person.ContactType table has a maximum identity value of 20. Si vous insérez une ligne dans la table, @@IDENTITY et SCOPE_IDENTITY() retournent la même valeur.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  

Voici l'ensemble des résultats.Here is the result set.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

La table Sales.Customer possède une valeur d'identité maximale de 29483.The Sales.Customer table has a maximum identity value of 29483. Si vous insérez une ligne dans la table, @@IDENTITY et SCOPE_IDENTITY() retournent des valeurs différentes.If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return different values. SCOPE_IDENTITY() retourne la valeur de l'insertion dans la table utilisateur, alors que @@IDENTITY retourne la valeur de l'insertion dans la table système de réplication.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. Utilisez SCOPE_IDENTITY() pour les applications qui doivent accéder à la valeur d'identité insérée.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  

Voici l'ensemble des résultats.Here is the result set.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

Voir aussiSee Also

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