2010-11-11 13 views
4

Je vais insérer des données dans une table comme ceci:Comment obtenir le champ Identité résultant d'une insertion?

Insert Into MyTable (Field1, Field2) 
      Values ('test', 5) 

Lorsque cet insert se produit, la nouvelle ligne va avoir une valeur identifier dans la colonne ID. Si j'ai une variable appelée @ID dans mon code T-SQL, comment remplir @ID avec le résultat de l'insertion T-SQL?

Declare @ID int 

Insert into MyTable (Field1, Field2) 
      Values ('test', 5) 

--//How do I populate @ID with the value of ID of the record that was just inserted? 

Répondre

18

Il y a deux façons - la première consiste à utiliser SCOPE_IDENTITY:

DECLARE @ID INT 

INSERT INTO MyTable (Field1, Field2) 
VALUES ('test', 5) 

SELECT @ID = SCOPE_IDENTITY() 

Ne pas utiliser @@ IDENTITY - la valeur qu'elle contient est la dernière colonne IDENTITY mise à jour sans tenir compte de la portée . Ce qui signifie, il n'est pas fiable qu'il détient la valeur pour votre INSERT, mais SCOPE_IDENTITY fait.

L'autre alternative consiste à utiliser le OUTPUT clause (SQL Server 2005+).

+0

Ooh. Je suis content d'avoir lu ça. Merci pour l'explication sur la différence entre '@@ Identity' et' Scope_Identity() ' –

2
SELECT @ID = SCOPE_IDENTITY(); 
0

Vous devez utiliser scope_identity dans votre cas.

Il existe différentes façons d'obtenir la dernière identité insérée et ils diffèrent dans la façon dont ils travaillent pour votre information les répertoriant -

  1. @@IDENTITY

  2. SCOPE_IDENTITY()

  3. IDENT_CURRENT

  4. OUTPUT CLAUSE (Venu le savoir de @OMG Poneys réponse)

Tenir compte de la differences et comparisons entre eux avant de décider lequel utiliser.

+0

@@ identity et ident_current ne devrait jamais être utilisé à cette fin. @@ identity retournera la valeur incorrecte si un trigger est placé sur la table qui insère dans une table avec une identité. ident_current est encore plus dangereux car il obtient la dernière identité utilisée par n'importe quelle connexion et peut facilement entraîner des problèmes d'intégrité des données quasiment impossibles à trouver et à résoudre. – HLGEM

+0

a mis à jour ma réponse. – Vishal