web-dev-qa-db-fra.com

SQL Server - Valeur de retour après INSERT

J'essaie de récupérer la valeur-clé après une instruction INSERT. Exemple: .__ J'ai une table avec les attributs name et id. id est une valeur générée.

    INSERT INTO table (name) VALUES('bob');

Maintenant, je veux récupérer l'identifiant dans la même étape. Comment est-ce fait?

Nous utilisons Microsoft SQL Server 2008.

242
melbic

Pas besoin d'un SELECT séparé ...

INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');

Cela fonctionne aussi pour les colonnes non-IDENTITY (telles que les GUID)

389
gbn

Utilisez SCOPE_IDENTITY() pour obtenir la nouvelle valeur d'ID

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

http://msdn.Microsoft.com/en-us/library/ms190315.aspx

152
Curt
INSERT INTO files (title) VALUES ('whatever'); 
SELECT * FROM files WHERE id = SCOPE_IDENTITY();

Est-ce le pari le plus sûr puisqu'il existe un problème connu avec le conflit de clause OUTPUT sur les tables avec des déclencheurs. Cela rend tout à fait peu fiable car même si votre table n'a actuellement aucun déclencheur - quelqu'un qui en ajoute un en bas de page brisera votre application. Comportement à la bombe à retardement.

Voir l'article msdn pour une explication plus détaillée:

http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx

33
hajikelist

Entity Framework exécute quelque chose de similaire à la réponse de gbn:

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');

SELECT t.[CustomerID]
FROM @generated_keys AS g 
   JOIN dbo.Customers AS t 
   ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0

Les résultats de sortie sont stockés dans une variable de table temporaire, puis sélectionnés sur le client. Je dois être au courant du gotcha:

les insertions peuvent générer plus d'une ligne, donc la variable peut contenir plus d'une ligne, de sorte que vous pouvez être retourné plus d'une ID

Je ne sais pas du tout pourquoi EF rejoindrait la table éphémère pour rejoindre la table réelle (dans quelles circonstances les deux ne correspondraient-ils pas).

Mais c'est ce que fait EF. 

SQL Server 2008 ou version ultérieure uniquement. Si c'est 2005, vous n'avez pas de chance.

20
Ian Boyd

@@ IDENTITY Est une fonction système qui renvoie la valeur d'identité insérée en dernier.

8
AngelaG

Vous pouvez utiliser scope_identity pour sélectionner l'ID de la ligne que vous venez d'insérer dans une variable, puis sélectionnez les colonnes de votre choix dans la table où id = l'identité que vous avez obtenue de scope_identity

Voir ici pour les informations MSDN http://msdn.Microsoft.com/en-us/library/ms190315.aspx

4
Purplegoldfish

la solution la meilleure et la plus sûre consiste à utiliser SCOPE_IDENTITY . Il vous suffit d'obtenir l'identité de la portée après chaque insertion et de l'enregistrer dans une variable, car vous pouvez appeler deux insertions dans la même portée . @ identity et @@ identity peut-être qu'ils travaillent mais ils ne sont pas sécuritaires. vous pouvez avoir des problèmes dans une grande application

  declare @duplicataId int
  select @duplicataId =   (SELECT SCOPE_IDENTITY())

Plus de détails ici Microsoft docs

2
MNF

Vous pouvez ajouter une instruction select à votre instruction insert. Sélectionnez Scope_Identity (); Cela retournera une valeur de l’identité lorsqu’il sera exécuté.

0
Robert Quinn

Voici comment j'utilise OUTPUT INSERTED lors de l'insertion dans une table utilisant ID en tant que colonne d'identité dans SQL Server:

'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
0
Richard Zembron