Citation :
Référence de Transact-SQL
SCOPE_IDENTITY
Renvoie la dernière valeur IDENTITY insérée dans une colonne IDENTITY dans la même étendue. Une étendue est un module, tel qu'une procédure stockée, un déclencheur, une fonction ou un lot. Ainsi, deux instructions sont dans la même étendue s'ils se trouvent dans la même procédure stockée ou fonction, ou dans le même lot.
Syntaxe
SCOPE_IDENTITY( )
Type des valeurs renvoyées
sql_variant
Notes
SCOPE_IDENTITY, IDENT_CURRENT et @@IDENTITY sont des fonctions similaires dans la mesure où elles renvoient les valeurs insérées dans les colonnes IDENTITY. IDENT_CURRENT n'est pas limitée au niveau de l'étendue et la session, car elle est restreinte à une table spécifiée. IDENT_CURRENT renvoie la valeur générée pour une table spécifique dans n'importe quelles session et étendue. Pour plus d'informations, voir IDENT_CURRENT.
SCOPE_IDENTITY et @@IDENTITY renvoient les dernières valeurs d'identité générées dans une table de la session en cours. Toutefois, SCOPE_IDENTITY renvoie les valeurs insérées uniquement dans l'étendue actuelle. @@IDENTITY n'est pas restreinte à une étendue spécifique.
Par exemple, vous disposez de deux tables (T1 et T2) et d'un déclencheur INSERT défini dans T1. Lorsqu'une ligne est insérée dans T1, le déclencheur s'active et insère une ligne dans T2. Ce scénario illustre deux étendues : insertion dans T1 et insertion dans T2 (action résultante du déclencheur).
Supposons que T1 et T2 incluent des colonnes IDENTITY : @@IDENTITY et SCOPE_IDENTITY renvoient des valeurs différentes à la fin d'une instruction INSERT dans T1.
@@IDENTITY renvoie la dernière valeur de la colonne IDENTITY insérée dans toute étendue au cours de la session actuelle, ce qui correspond à la valeur insérée dans T2.
SCOPE_IDENTITY() renvoie la valeur IDENTITY insérée dans T1, ce qui correspond à la dernière instruction INSERT exécutée dans la même étendue. La fonction SCOPE_IDENTITY() renvoie la valeur NULL si la fonction est invoquée avant que toute instruction INSERT dans une colonne d'identité ne soit exécutée dans l'étendue.
Les exemples suivants illustrent ce scénario.
Exemple
L'exemple suivant crée deux tables, TZ et TY, et place un déclencheur INSERT dans TZ. Lorsqu'une ligne est insérée dans la table TZ, le déclencheur (Ztrig) s'active et insère une ligne dans 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')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla')
SELECT * FROM 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')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator')
SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator
/*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
/*FIRE the trigger and find out what identity values you get 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
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/
@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/
Voir aussi
@@IDENTITY
©1988-2000 Microsoft Corporation. Tous droits réservés.
|