requete - sql where max




Obtenir le dernier ID de ligne inséré(avec l'instruction SQL) (2)

Cette question a déjà une réponse ici:

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 doit créer la table temporaire.

Je souhaite renvoyer l'ID après l'exécution de l'instruction INSERT (en supposant que j'exécute un seul INSERT).

Exemple:

1     Joe      Joe
2     Michael  Mike
3     Zoe      Zoe

Lors de l'exécution d'une instruction INSERT, je veux retourner l'ID créé, signifie 4.

Peut me dire comment faire cela en utilisant la déclaration SQL ou ce n'est pas possible?


En supposant une simple table:

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

Nous pouvons capturer des valeurs IDENTITY dans une variable de table pour une consommation 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;

La bonne chose à propos de cette méthode est (a) il gère les insertions à plusieurs lignes ( SCOPE_IDENTITY() ne renvoie que la dernière valeur) et (b) il évite support.microsoft.com/kb/2019779 , ce qui peut conduire à des résultats erronés SQL Server 2008 R2 SP1 CU5.


Si votre table SQL Server a une colonne de type INT IDENTITY (ou BIGINT IDENTITY ), vous pouvez 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 ligne - elle renvoie juste la dernière valeur IDENTITY distribuée dans cette portée ici.

Il y a au moins deux autres options - @@IDENTITY et IDENT_CURRENT - en savoir plus sur leur fonctionnement et en quoi elles sont différentes (et pourraient vous donner des résultats inattendus) dans cet excellent article de Pinal Dave ici .





sql-server