178 votes

Obtenir l'ID de la dernière ligne insérée (avec une instruction SQL)

Je veux obtenir le nouvel ID créé lorsque vous insérez un nouvel enregistrement dans la table.

J'ai lu ceci : http://msdn.microsoft.com/en-us/library/ms177564.aspx mais il faut créer une table temporaire.

Je veux renvoyer l'ID après l'exécution de l'instruction INSERT (en supposant que l'on n'exécute qu'un seul INSERT).

Ejemplo:

1     Joe      Joe
2     Michael  Mike
3     Zoe      Zoe

Lors de l'exécution d'une instruction INSERT, je veux renvoyer l'ID créé, c'est-à-dire 4.

Pouvez-vous me dire comment faire cela en utilisant une déclaration SQL ou ce n'est pas possible ?

311voto

marc_s Points 321990

Si votre table SQL Server possède une colonne de type INT IDENTITY (ou BIGINT IDENTITY ), vous pouvez alors obtenir la dernière valeur insérée en utilisant :

INSERT INTO dbo.YourTable(columns....)
   VALUES(..........)

SELECT SCOPE_IDENTITY()

Cela fonctionne tant que vous n'avez pas inséré une autre rangée - cela renvoie simplement la dernière IDENTITY valeur distribuée dans ce périmètre ici.

Il y a au moins deux autres options - @@IDENTITY y IDENT_CURRENT - Pour en savoir plus sur leur fonctionnement et leurs différences (qui peuvent donner des résultats inattendus), consultez le site suivant excellent article de blog de Pinal Dave ici .

70voto

Aaron Bertrand Points 116343

En supposant un tableau simple :

CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);

Nous pouvons capturer IDENTITY dans un tableau variable pour une utilisation ultérieure.

DECLARE @IDs TABLE(ID INT);

-- minor change to INSERT statement; add an OUTPUT clause:
INSERT dbo.foo(name) 
  OUTPUT inserted.ID INTO @IDs(ID)
SELECT N'Fred'
UNION ALL
SELECT N'Bob';

SELECT ID FROM @IDs;

L'avantage de cette méthode est (a) qu'elle gère les insertions de plusieurs rangs ( SCOPE_IDENTITY() ne renvoie que la dernière valeur) et (b) elle permet d'éviter ce bug de parallélisme qui peut conduire à des résultats erronés mais jusqu'à présent, il n'est corrigé que dans SQL Server 2008 R2 SP1 CU5.

64voto

MaxRecursion Points 750

Vous pouvez utiliser :

SELECT IDENT_CURRENT('tablename')

pour accéder à la dernière identité pour une table particulière.

Par exemple, en considérant le code suivant :

INSERT INTO dbo.MyTable(columns....) VALUES(..........)

INSERT INTO dbo.YourTable(columns....) VALUES(..........)

SELECT IDENT_CURRENT('MyTable')

SELECT IDENT_CURRENT('YourTable')

Cela permettrait d'obtenir la valeur correcte pour les tables correspondantes.

Il renvoie le dernier IDENTITY valeur produite dans une table, quelle que soit la connexion qui a créé la valeur, et quelle que soit la portée de la déclaration qui a produit la valeur.

IDENT_CURRENT n'est pas limité par la portée et la session ; il est limité à une table spécifique. IDENT_CURRENT renvoie la valeur d'identité générée pour une table spécifique dans n'importe quelle session et n'importe quelle portée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X