SQL Server: Est-il possible d'insérer dans les deux tables en même temps?
Ma base de données contient trois tables appelé Object_Table
, Data_Table
et Link_Table
. Le lien tableau contient deux colonnes, l'identité d'un objet et d'une identité d'enregistrement de données.
Je veux copier les données à partir de DATA_TABLE
où il est lié à un compte tenu de l'identité de l'objet et d'insérer des enregistrements correspondants dans Data_Table
et Link_Table
pour un autre compte tenu de l'identité de l'objet.
Je peut le faire en sélectionnant dans une variable de table et la boucle grâce à deux inserts pour chaque itération.
Est-ce la meilleure façon de le faire?
Modifier : je veux éviter une boucle pour deux raison, la première c'est que je suis paresseux et une boucle/temp table nécessite plus de code, plus de code, plus d'endroits pour faire une erreur et la deuxième raison, c'est un sujet de préoccupation au sujet de la performance.
Je peux copier toutes les données d'une plaquette, mais comment obtenir la table de lien de lien pour les nouveaux enregistrements de données où chaque enregistrement a une nouvelle id?
- Je ne comprends pas l'intérêt d'essayer de le faire avec UN insert, quand le faire avec 2 inserts fonctionne parfaitement bien. Voulez-vous dire, vous voulez vous assurer que les 2 plaquettes sont à la fois terminé? Ensuite, vous aurez à vérifier ce commit/rollback instruction.
- Je serais heureux avec deux inserts, c'est juste que les identités qui doivent être insérées dans la table de liaison sont les identités généré lors de la première insertion.
Vous devez vous connecter pour publier un commentaire.
Dans un déclaration: Non.
Dans un transaction: Oui
La bonne nouvelle, c'est que le code ci-dessus est aussi la garantie d' atomique, et peuvent être envoyés au serveur à partir d'une application cliente avec une chaîne sql dans un seul appel de fonction, comme si c'était une déclaration. Vous pouvez également appliquer un déclencheur à une table pour obtenir l'effet d'un seul insert. Cependant, c'est en fin de compte encore deux états et que vous ne voulez probablement pas à exécuter le déclencheur pour chaque insérer.
insert into ... select ...
déclaration. Comment fonctionne le code ci-dessus, de lire ou de faire une boucle par la Object_Table de données. Vous avez encore faut utiliser une variable de table dont le demandeur n'a pas envie de faire.Vous avez encore besoin de deux
INSERT
états, mais il semble que vous voulez obtenir leIDENTITY
de la première insertion et de l'utiliser dans le second, auquel cas, vous voudrez peut-être regarder dansOUTPUT
ouOUTPUT INTO
: http://msdn.microsoft.com/en-us/library/ms177564.aspxLe tableau suivant présente la situation que j'avais, à l'aide de la table des variables.
Grâce à un autre réponse qui m'a orienté vers la SORTIE de la clause que je peut montrer une solution:
Il s'avère cependant qu'il n'est pas aussi simple dans la vraie vie en raison de l'erreur suivante
Je peux encore
OUTPUT INTO
une table temp puis finir avec la normale de l'insertion. Si je peux éviter de ma boucle, mais je ne peux pas éviter de la table temp.Ça sonne comme le Lien de ce tableau montre les différentes:beaucoup de relation entre l'Objet de la table et de la table de Données.
Ma suggestion est d'utiliser une procédure stockée pour gérer les transactions. Lorsque vous voulez insérer dans l'Objet ou le tableau de Données effectuer vos inserts, obtenir les nouvelles Id et de les insérer à la table de Liaison.
Cela permet à tous de votre logique de rester encapsulé dans un facile d'appeler la procédure stockée.
Si vous voulez que les actions sont plus ou moins atomique, je voudrais assurez-vous envelopper dans une transaction. De cette façon, vous pouvez être sûr que les deux qui s'est passé, ou les deux, n'a pas lieu en tant que de besoin.
Vous pouvez créer une Vue de la sélection de la colonne de noms requis par votre instruction insert, ajouter un Déclencheur INSTEAD OF INSERT, et l'insérer dans ce point de vue.
Je veux insister sur l'utilisation de
pour le MSSQL transaction avec plusieurs instructions sql.
Voir: https://msdn.microsoft.com/en-us/library/ms188792.aspx
Ils fournissent un bon exemple.
Donc le code final doit ressembler à l'exemple suivant:
Insertion ne peut fonctionner que sur une seule table à la fois. Plusieurs Insertions avoir plusieurs états.
Je ne sais pas si vous avez besoin de faire une boucle dans une variable de table - ne pouvez-vous pas simplement utiliser une masse d'insérer dans une table, puis la masse de l'insérer dans l'autre?
Par la manière - je devine que vous dire de copier les données de Object_Table; autrement, la question n'a pas de sens.
Avant d'être en mesure de faire une multitabler insérer dans Oracle, vous pouvez utiliser une astuce impliquant une insertion dans une vue qui avait défini un déclencheur INSTEAD OF sur elle pour effectuer les insertions. Cela peut être fait dans SQL Server?
//si vous souhaitez insérer la même que la première table
//ou si vous souhaitez insérer certaines parties de la table, de
//je sais que cela semble trop beau pour être droit, mais il fonctionne et vous pouvez continuer à ajouter de la requête, il suffit de changer le
J'ai 17 tables de ce qui a travaillé à.