2010-07-14 8 views
7

Je vais donner un exemple de pseudocode de ma méthode actuelle et si quelqu'un connaît une méthode qui ne fonctionne pas une ligne à la fois, je serais très reconnaissant. J'utilise MS SQL Server 2008.Y at-il un moyen d'insérer en vrac dans deux tables avec FK de l'un à l'autre?

define cursor for the data to be inserted (about 3 million records) 
loop 
(
    insert record into table 1 
    use scope_identity() to get key 
    insert record into table 2 that references table 1 
) 

Je ferais bien plutôt une sorte d'insertion dans les deux tables simultanément, car un curseur et la boucle sont lents. Avant que quelqu'un ne sache pourquoi j'insère quelque chose dans deux tables distinctes ayant une relation 1 à 1, c'est parce que la première table ne peut pas être modifiée et j'ai besoin des informations dans la seconde table (temporaire) pour la référence des données opérations de conversion plus tard. Non, je ne peux pas ajouter une colonne temporaire pour maintenir les données de référence dans la table qui ne peuvent pas être modifiées car elles ne peuvent pas être modifiées. C'est un système en direct et je n'ai pas les permissions pour modifier la table.

Merci!

Informations additionnelles:

Ex

Source: 

1 a big monkey 
2 a tall elephant 
3 a big giraffe 
4 a tiny cow 
5 a tall cow 

Dest: 

Table 1  Table 2 
monkey  1 big 
elephant  2 tall 
giraffe  3 big 
cow   4 tiny 
cow   5 tall 
+1

[Est-ce que cette réponse aide?] (Http://stackoverflow.com/q/5365629/73226) –

Répondre

0

Avec que beaucoup de données, la meilleure option pourrait être d'isoler les mises à jour du système, permettent identity insert et prepoulate les clés avant de l'insérer.


Ou, pouvez-vous faire juste le premier insert, puis modifier l'insert pour la deuxième (à partir d'une table temporaire) de se joindre à des données originales et trouver la clé.

+0

Bonnes idées et merci, mais ... Je ne peux pas modifier la première table pour permettre l'insertion d'identité. La deuxième idée serait parfaite mais la raison pour laquelle j'ai besoin de la deuxième table avec une clé étrangère à la première est parce que les données que j'insère dans la première ne contiennent rien pour rendre chaque enregistrement unique. La deuxième table de destination contiendrait essentiellement l'identité de la table source. Voir plus d'infos J'ai ajouté à la question. – AppFzx

+2

Vous n'avez pas besoin de * modifier * la table pour autoriser l'insertion d'identité - il vous suffit de mettre entre parenthèses votre instruction d'insertion avec SET IDENTITY_INSERT ON et SET IDENTITY_INSERT OFF. –

0

Utilisez IDENTITY_INSERT, un trigger VIEW et un trigger INSTEAD OF, et des valeurs d'identité préremplies avec votre insert.

See this SQL Fiddle.

Je ai essayé de flailing avec diverses choses dans le déclencheur INSTEAD OF pour laisser la colonne d'identité de T1 être utilisé pour T2, mais finalement j'ai échoué.

0
insert into table1 
select substring(src.data, 8 /* assuming fixed length as exampled */, len(src.data)) 
from source src 

insert into table2 
select t1.id, substring(src.data, 3 /* skip 'a ' */, 7) 
from 
    table1 t1 
     inner join source src 
     on substring(src.data, 8, len(src.data)) = t1.data 

Pour l'exemple donné, je ne peux pas faire mieux ...

+0

Ah! Un index sur t1 (data, id) pourrait aider ... –

1

Vous pouvez utiliser merge sur Table1 et et output dans Table2.

merge Table1 
using SourceTable 
on 0 = 1 
when not matched then 
    insert (Animal) values (SourceTable.Animal) 
output inserted.ID, SourceTable.Size into Table2(ID, Size); 

SQL Fiddle

Note: Si Table2 a une clé étrangère définie contre Table1 vous ne pouvez pas la sortie directement à Table2. Dans ce cas, vous pouvez utiliser une table temporaire comme cible de la sortie et l'insérer dans Table2 à partir de la table temporaire.