Insérer et relier des loggings dans une requête SQL unique?

J'essaie de copyr datatables d'une ancienne database dans un nouveau, et le transformer pour suivre la nouvelle structure de DB. Le vieux ressemblait à ceci:

Tableau 1:

Id | Col A ---------- 1 0 2 8 3 7 4 1 

Dans la nouvelle database, le tableau 1 ressemble à ceci, où datatables de col A sont maintenant dans une autre table, et elles sont reliées à la table 1 via la colonne de key étrangère A_Id:

Tableau 1:

 Id | A_Id_FK ---------- 1 0 2 1 3 2 4 3 

Tableau 2:

 Id | Col A ---------- 0 0 1 8 2 7 3 1 

Donc … Je suis très rouillé avec mes compétences SQL. J'ai besoin d'une requête unique (lire: la vitesse n'a pas d'importance) pour créer les loggings de la table 2 tout en les reliant simultanément aux loggings de la table 1. Un autre point à mentionner est que j'ai deux bases de données. L'un est l'ancien avec le tableau 1, et l'autre est le nouveau avec un tableau vide 2, et un tableau 1 qui a toutes les autres informations en dehors de l'A_Id_FK, qui pour l'instant est simplement lié à un logging vide dans le tableau 2 pour chaque logging.

Merci d'avance.

Modifier – Pour plus de clarté, le tableau 2 dans le nouveau DB est vide. Col A dans l'ancienne database n'est pas un nombre unique (en fait, ce n'est pas un nombre du tout, mais c'est juste comme ça pour plus de simplicité). Le tableau 1 de la nouvelle database est rempli, mais la valeur dans A_Id_FK est définie sur 1 pour tout ce qui a juste une key étrangère valide. Enfin, même les loggings Col A identiques ont besoin de leur propre instance dans la nouvelle database.

Vous pouvez utiliser CURSOR (Table_2.id est l'identité):

 DECLARE @id INT DECLARE @col_a VARCHAR(50) DECLARE db_cursor CURSOR FOR SELECT id, col_a FROM Table_Source OPEN db_cursor FETCH NEXT FROM db_cursor INTO @id, @col_a WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO Table_2 (col_a) VALUES (@col_a) INSERT INTO Table_1 (id, fk) VALUES (@id, @@IDENTITY) FETCH NEXT FROM db_cursor INTO @id, @col_a END CLOSE db_cursor DEALLOCATE db_cursor 

En supposant bases de données "Ancien" et "Nouveau" avec les structures de table décrites ci-dessus, en supposant que les deux bases de données sont présentes dans la même instance SQL, en supposant que chaque valeur "ColA" dans le Vieux Table1 est présente re chargement des données pour la première fois, une version serait:

 INSERT New.dbo.Table1 (Id, A_Id_FK) select Old.Id, New2.Id from Old.dbo.Table1 Old inner join New.dbo.Table2 New2 on New2.ColA = Old.ColA 

On dirait que vous avez peut-être déjà peuplé New..Table1? Si c'est le cas, vous aurez besoin d'une sorte d'instruction de mise à jour qui lie cette table avec Old..Table1 et New..Table2.

Je suppose Id dans Table2 est une identité dans le code ci-dessous.

 insert into Table2 (ColA) select distinct ColA from OldTable1 insert into Table1 (Id, A_Id_FK) select ot.Id, t2.Id from OldTable1 ot inner join Table2 t2 on ot.ColA = t2.ColA