2010-10-19 6 views
4

J'ai deux tables avec une relation parent-enfant. Je voudrais copier certains de leurs enregistrements à deux autres tables, également avec une relation parent-enfant, mais avec une structure de table légèrement différente.Copie d'une relation 1-à-plusieurs entre deux tables vers deux autres tables (SQL 2005)

Une clé étrangère est associée aux deux ensembles de tables, une colonne entière. Toutes les tables ont l'incrément d'identité pour leurs colonnes de clé primaire. Si j'effectue un SELECT INTO depuis la table parent source vers la table parent de destination, les valeurs de clé primaire pour les enregistrements de destination seront différentes des enregistrements source et la relation parent-enfant sera perdue.

Est-ce que quelqu'un sait comment je peux préserver cette relation pendant la copie, étant donné que j'aurai de nouvelles valeurs de clé primaire dans la nouvelle table parente? Je préférerais ne pas définir l'incrément d'identité pour les nouvelles tables pendant cette procédure de copie, car il n'y a aucune garantie que les valeurs de clé primaire dans la table source ne seront pas déjà dans la destination.

J'espère que ma description est logique, et merci pour vos opinions. Faites-moi savoir si je peux clarifier davantage.

Répondre

1

Vous devez conserver l'ID d'origine dans une colonne séparée de la table avec l'ID parent correspondant. Donc, dans votre table de destination, vous devez ajouter une colonne parentID_orig (pas de numéro automatique) pour conserver le lien.

+0

Merci pour le conseil, je pensais à quelque chose le long de ces lignes au début. Si l'idée de Gabriel ne je regarderai pas marché dedans. – larryq

3

Lorsque je l'ai fait, je l'ai fait en conservant l'ancien ID après l'insertion dans la nouvelle table.

Certaines personnes ajoutent une colonne temporaire avec l'ancien ID, mais je connais un meilleur moyen.

Vous pouvez utiliser the OUTPUT clause pour insérer les enregistrements insérés dans une table temporaire (avec les nouveaux et les anciens ID comme une table de correspondance. Alors rejoignez que lors de l'insertion des enregistrements enfants.

Quelque chose comme ça (brut)

DECLARE @MyTableVar TABLE (
    NewID INT, 
    OldID INT 
) 

INSERT NewParentTable 
OUTPUT 
    INSERTED.ID, 
    old.ID 
INTO @MyTableVar 
SELECT * 
FROM OldParentTable old 


INSERT NewChildTable 
SELECT 
    old.ID, 
    t.NewID, 
    old.name 
FROM OldChildTable old 
INNER JOIN @MyTableVar t ON t.OldID = old.ParentID 
+0

Merci. Ça a l'air très prometteur – larryq

+1

étrange, je suis obtenir une erreur dans l'instruction OUTPUT, en ce qui concerne "l'identificateur multi-pièces old.ID n'a pas pu être trouvé". e lecture que j'ai fait sur OUTPUT, aucun d'entre eux ont des exemples qui n'ont pas préfixé les colonnes de sortie avec INSERTED ou DELETED. Puis-je utiliser un nom de table comme préfixe dans OUTPUT? – larryq

+1

Je viens de me pencher dessus, et il semble que la clause OUTPUT INTO ne soit pas supportée dans les instructions INSERT qui contiennent une clause . –