web-dev-qa-db-fra.com

Comment utiliser la clause OUTPUT d'une instruction INSERT pour obtenir la valeur d'identité?

Si j'ai une déclaration insert telle que:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

Comment définir @var INT sur la valeur d'identité de la nouvelle ligne (appelée Id) à l'aide de la clause OUTPUT? J'ai vu des exemples d'insertion de INSERTED.Name dans des variables de table, par exemple, mais je ne peux pas l'obtenir dans une variable non-table.

J'ai essayé OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id, mais aucun n'a fonctionné.

216
Yatrix

Vous pouvez soit avoir le nouvel ID inséré en sortie sur la console SSMS comme ceci:

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

Vous pouvez aussi utiliser ceci, par exemple. C #, lorsque vous devez récupérer l'ID dans votre application appelante, exécutez simplement la requête SQL avec .ExecuteScalar() (au lieu de .ExecuteNonQuery()) pour lire le résultat ID.

Ou si vous devez capturer la ID nouvellement insérée dans T-SQL (par exemple, pour un traitement ultérieur), vous devez créer une variable de table:

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

De cette façon, vous pouvez mettre plusieurs valeurs dans @OutputTbl et les traiter ultérieurement. Vous pouvez également utiliser une table temporaire "normale" (#temp) ou même une table "réelle" persistante comme "cible de sortie" ici.

422
marc_s