J'insère plusieurs enregistrements dans une table A à partir d'une autre table B. Existe-t-il un moyen d'obtenir la valeur d'identité de l'enregistrement de la table A et de mettre à jour l'enregistrement de la table B sans avoir recours à un curseur ?
Create Table A
(id int identity,
Fname nvarchar(50),
Lname nvarchar(50))
Create Table B
(Fname nvarchar(50),
Lname nvarchar(50),
NewId int)
Insert into A(fname, lname)
SELECT fname, lname
FROM B
J'utilise MS SQL Server 2005.
1 votes
La réponse d'Andy Irving est la meilleure. Les déclencheurs sont maladroits et ne fonctionnent pas bien pour les opérations arbitraires sur votre table cible, en particulier si votre cible est temporaire ou simplement intermédiaire. La réponse de Darren est erronée, si vous insérez un ensemble de lignes, leur ordre dans la table cible n'est pas nécessairement le même que l'ordre de votre ensemble. La méthode de Dmitry est mauvaise parce qu'elle nécessite une boucle autour de l'insertion d'une seule ligne à la fois, ce qui est lent en termes de performances, utilisez toujours des ensembles lorsque vous le pouvez. La méthode de Cory est mauvaise et il a expliqué pourquoi, "tant qu'il n'y a pas de conflit". Cela va devenir un vrai débat du samedi soir.
0 votes
Je sais que cette question est ancienne et qu'elle concerne SQL Server 2005, mais comme c'est le premier résultat qui apparaît, l'instruction MERGE disponible à partir de 2008 doit être mentionnée pour ceux qui cherchent une solution. MERGE INTO TargetTable USING ( SELECT.... ) AS Source ON 1 = 2 WHEN NOT MATCHED THEN INSERT.... OUTPUT inserted.ID INTO TempTable ( InsertedID )
0 votes
Il n'est pas nécessaire de procéder à une fusion pour une simple insertion. La fusion est utile pour une insertion/mise à jour, mais elle est superflue pour une simple insertion. La réponse d'Andy a fonctionné pour moi et a permis de supprimer un verrou d'index.
0 votes
Vous pourriez avoir besoin d'un
MERGE
conOUTPUT
si vous insérez des éléments liés et que vous avez donc besoin d'une table de correspondance comme (FakeID, IdentityID) pour savoir quel FakeID correspond à l'élément résultant.IDENTITY
valeur.