IDENT_CURRENT (Transact-SQL)
Retourne la dernière valeur d'identité générée pour une table ou une vue spécifiée. La dernière valeur d'identité générée peut être pour toute session et toute étendue.
Syntaxe
IDENT_CURRENT( 'table_name' )
Arguments
- table_name
Nom de la table dont la valeur d'identité doit être retournée. L'argument table_name est de type varchar et n'a pas de valeur par défaut.
Types des valeurs renvoyées
numeric(38,0)
Exceptions
Retourne la valeur NULL en cas d'erreur ou si un appelant n'est pas autorisé à afficher l'objet.
Dans SQL Server, un utilisateur peut voir uniquement les métadonnées des éléments sécurisables qui lui appartiennent ou pour lesquels il dispose d'un droit d'accès. Cela signifie que les fonctions intégrées générant des métadonnées, telles que IDENT_CURRENT, peuvent retourner la valeur NULL si l'utilisateur ne dispose d'aucune autorisation sur l'objet. Pour plus d'informations, consultez Configuration de la visibilité des métadonnées et Dépannage de la visibilité des métadonnées.
Notes
IDENT_CURRENT est similaire aux fonctions d'identité SCOPE_IDENTITY et @@IDENTITY de SQL Server 2000. Ces trois fonctions renvoient les dernières valeurs d'identité générées. Toutefois, la portée et la session sur lesquelles le paramètre last est défini diffèrent pour chacune de ces fonctions :
IDENT_CURRENT renvoie la dernière valeur d'identité générée pour une table spécifique dans n'importe quelles session et étendue.
@@IDENTITY renvoie la dernière valeur d'identité générée pour n'importe quelle table dans la session en cours et l'ensemble des étendues.
SCOPE_IDENTITY renvoie la dernière valeur d'identité générée pour n'importe quelle table dans la session et l'étendue en cours.
Lorsque la valeur IDENT_CURRENT est NULL (si la table n'a jamais contenu de ligne ou a été tronquée), la fonction IDENT_CURRENT retourne la valeur de départ.
Les instructions et transactions ayant échoué peuvent modifier l'identité actuelle d'une table et créer des écarts dans les valeurs de colonnes d'identité. La valeur d'identité n'est jamais annulée, même si la transaction qui a tenté d'insérer la valeur dans la table n'est pas validée. Par exemple, si une instruction INSERT échoue à cause d'une violation IGNORE_DUP_KEY, la valeur d'identité actuelle de la table est quand même incrémentée.
Soyez prudent lorsque vous utilisez IDENT_CURRENT pour prévoir la valeur d'identité générée suivante. La valeur effectivement générée peut être différente de la somme des valeurs IDENT_CURRENT et IDENTITY_INCR si d'autres sessions effectuent des insertions.
Exemples
A. Renvoi de la dernière valeur d'identité générée pour une table spécifiée
L'exemple suivant renvoie la dernière valeur d'identité générée pour la table Person.Address de la base de données AdventureWorks.
USE AdventureWorks;
GO
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
GO
B. Comparaison des valeurs d'identité renvoyées par IDENT_CURRENT, @@IDENTITY et SCOPE_IDENTITY
L'exemple suivant affiche les valeurs d'identité différentes renvoyées par IDENT_CURRENT, @@IDENTITY et SCOPE_IDENTITY.
USE AdventureWorks;
GO
IF OBJECT_ID(N't6', N'U') IS NOT NULL
DROP TABLE t6;
GO
IF OBJECT_ID(N't7', N'U') IS NOT NULL
DROP TABLE t7;
GO
CREATE TABLE t6(id int IDENTITY);
CREATE TABLE t7(id int IDENTITY(100,1));
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
INSERT t7 DEFAULT VALUES
END;
GO
--End of trigger definition
SELECT id FROM t6;
--id is empty.
SELECT id FROM t7;
--ID is empty.
--Do the following in Session 1
INSERT t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Returns the value 100. This was inserted by the trigger.*/
SELECT SCOPE_IDENTITY();
/* Returns the value 1. This was inserted by the
INSERT statement two statements before this query.*/
SELECT IDENT_CURRENT('t7');
/* Returns value inserted into t7, that is in the trigger.*/
SELECT IDENT_CURRENT('t6');
/* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/
-- Do the following in Session 2.
SELECT @@IDENTITY;
/* Returns NULL because there has been no INSERT action
up to this point in this session.*/
SELECT SCOPE_IDENTITY();
/* Returns NULL because there has been no INSERT action
up to this point in this scope in this session.*/
SELECT IDENT_CURRENT('t7');
/* Returns the last value inserted into t7.*/