web-dev-qa-db-fra.com

Comment insérer plusieurs enregistrements et obtenir la valeur d'identité?

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 faire de 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.

54
Dwight T

Utilisez la clause de sortie de 2005:

DECLARE @output TABLE (id int)

Insert into A (fname, lname)
OUTPUT inserted.ID INTO @output
SELECT fname, lname FROM B

select * from @output

maintenant, votre variable de table a les valeurs d'identité de toutes les lignes que vous insérez.

145
Andy Irving

En lisant attentivement votre question, vous souhaitez simplement mettre à jour le tableau B en fonction des nouvelles valeurs d'identité dans le tableau A.

Une fois l'insertion terminée, exécutez simplement une mise à jour ...

UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
     ON (B.FName = A.Fname AND B.LName = A.LName)

Cela suppose que la combinaison FName/LName peut être utilisée pour faire correspondre les enregistrements entre les tables. Si ce n'est pas le cas, vous devrez peut-être ajouter des champs supplémentaires pour vous assurer que les enregistrements correspondent correctement.

Si vous ne disposez pas d'une clé alternative qui vous permet de faire correspondre les enregistrements, cela n'a aucun sens, car les enregistrements du tableau B ne peuvent pas être distingués les uns des autres.

5
njr101

Si vous souhaitez toujours ce comportement, vous pouvez placer un déclencheur AFTER INSERT sur la table qui mettra à jour la table B.

0
Matt

Vous pouvez l'obtenir en rejoignant le numéro de ligne . Cela est possible car comme il s'agit d'une identité, elle augmentera simplement lorsque vous ajouterez des éléments, qui seront dans l'ordre dans lequel vous les sélectionnez.

0
Darren Kopp

Si je comprends bien, le problème que vous rencontrez est que vous voulez INSÉRER dans le tableau A, qui a une colonne d'identité, et que vous souhaitez conserver l'identité du tableau B qui n'en a pas.

Pour ce faire, vous devez simplement activer l'insertion d'identité sur la table A. Cela vous permettra de définir vos identifiants lors de l'insertion et tant qu'ils n'entrent pas en conflit, tout devrait bien se passer. Ensuite, vous pouvez simplement faire:

Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B

Je ne sais pas quelle base de données vous utilisez, mais pour le serveur SQL, la commande pour activer l'insertion d'identité serait:

set identity_insert A on
0
Cory

Je suggère d'utiliser un type d'identification unique au lieu de l'identité. Dans ce cas, vous pouvez générer des identifiants avant l'insertion:

update B set NewID = NEWID()

insert into A(fname,lname,id) select fname,lname,NewID from B
0
Dmitry Khalatov