web-dev-qa-db-fra.com

Comment obtenir la valeur d'auto-incrémentation de la dernière ligne à l'insert

J'ai googlé ce problème une semaine et aucune chose d'utile je pense n'utilise pas le mot correct

J'utilise SQL Server 2008 avec t-sql et mon besoin est d'optimiser ma fonction lorsque j'insère une nouvelle ligne.

J'ai une table avec la première colonne est la clé du type entier auto-incrémenté et les autres colonnes sont juste pour information

Quand nous faisons une insertion, SQL Server incrémente automatiquement la clé et je dois faire un select max pour obtenir la valeur. Il existe donc un moyen semblable à une variable globale comme @@IDENTITY ou à une fonction permettant d'éviter la transaction begin end et select max. 

19
yacine ouah

Utilisez SCOPE_IDENTITY :

-- do insert

SELECT SCOPE_IDENTITY();

Ce qui vous donnera:

La dernière valeur d'identité insérée dans une colonne d'identité dans la même portée. Une étendue est un module: une procédure stockée, un déclencheur, fonction, ou lot. Par conséquent, deux instructions ont la même portée si ils sont dans la même procédure stockée, fonction ou lot.

34
Mahmoud Gamal

Je viens de lancer le code:

INSERT INTO Persons (FirstName) VALUES ('Joe');
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity;

et ça marche aussi! 

5
Eddy Jawed

Qu'en est-il de la dernière valeur d'incrémentation automatique

SELECT IDENT_CURRENT('tableName')-IDENT_INCR('tableName');
3
user1810132

Dans mon cas, je devais utiliser @@ Identity, car je m'inscrivais dans une vue. Il semble que SCOPE_IDENTITY ne fonctionne que pour ceux que vous avez explicitement créés.

Vois ici:

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

@@ IDENTITY renverra la dernière valeur d'identité entrée dans une table dans votre session en cours. Alors que @@ IDENTITY est limité au .__ actuel. session, il n’est pas limité à la portée actuelle. Si vous avez un déclencheur sur une table qui crée une identité dans une autre table, vous obtiendra l'identité qui a été créée en dernier, même s'il s'agissait du déclencheur qui l'a créé.

0
Dan