2008-11-24 6 views

Répondre

0

Immédiatement après l'exécution de l'instruction d'insertion sur la première table, vous devez interroger @@ IDENTITY en faisant "SELECT @@ identity". Cela récupérera le dernier ID généré automatiquement ... puis l'insérera sur la seconde table.

Si vous utilisez des déclencheurs ou quelque chose qui insère des lignes ... cela peut ne pas fonctionner. Utilisez Scope_Identity() au lieu de @@ IDENTITY

+0

scope_identity() est généralement préféré à @@ identity en dehors des triggers: êtes-vous sûr qu'un trigger ne sera pas ajouté plus tard, en "cassant" le code en silence? –

+0

SCOPE_IDENTITY() est juste que je pense que je veux – mavera

0

Je ferais probablement cela avec un déclencheur INSERT sur la table d'entrée nommée, si vous avez toutes les données que vous avez besoin de pousser à la table de balises disponibles. Si ce n'est pas le cas, vous pouvez envisager d'utiliser une procédure stockée qui crée les deux à l'intérieur d'une transaction.

Si vous voulez le faire dans le code, vous devrez être plus précis sur la façon dont vous gérez vos données. Utilisez-vous DataAdapter, DataTables, LINQ, NHibernate, ...? Essentiellement, vous devez envelopper les deux insertions dans une transaction de sorte que les insertions soient exécutées ou ne le soient pas, mais les moyens de le faire dépendent de la technologie que vous utilisez pour interagir avec la base de données.

+0

Merci pour accord, mais je n'ai jamais utilisé la procédure stockée ou de déclenchement. J'utilise SQL dynamique dans mes projets et s'il y a un moyen de le faire avec SQL dynamique, ce sera mieux. – mavera

4

La seule façon de faire cela est avec plusieurs instructions. Utilisation de SQL dynamique, vous pouvez le faire en séparant chaque déclaration dans votre chaîne de requête avec un point-virgule:

"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);" 

Assurez-vous que vous mettez cela dans une transaction pour protéger contre les problèmes de conflit et de tout garder atomique. Vous pouvez également diviser cela en deux requêtes distinctes pour renvoyer la nouvelle valeur d'ID au milieu si vous le souhaitez; Assurez-vous simplement que les deux requêtes sont dans la même transaction.

En outre: vous utilisez des requêtes paramétrées avec votre SQL dynamique, n'est-ce pas? Si vous ne l'êtes pas, je viendrai personnellement là-bas et vous frapper 10 000 fois avec une nouille humide jusqu'à ce que vous vous repentiez de vos moyens insécurisés.

+0

Vous voudrez emballer ces dans une transaction au cas où la deuxième insertion échoue. – tvanfosson

+0

Tout à fait raison. Mis à jour pour rendre le plus clair. –

0

Si vous utilisez SQL dynamique, pourquoi ne pas utiliser Linq to Entity Framework, maintenant EF est la technologie d'accès aux données recommandée par Microsoft (voir cet article Clarifying the message on L2S Futures du blog de l'équipe ADO.NET), et si vous faites un insert avec EF le dernier identifiant d'identité sera disponible pour vous automatiquement, je l'utilise tout le temps c'est facile.

Espérons que cela aide!

Ray.

Questions connexes