2010-07-14 7 views
7

Darò uno pseudocodice del mio metodo attuale e se qualcuno conosce un metodo che non funziona una riga alla volta, sarei molto riconoscente. Sto utilizzando MS SQL Server 2008.C'è un modo per inserire in massa due tabelle con FK da una all'altra?

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 
) 

Preferirei mille volte fare una sorta di inserto in entrambe le tabelle contemporaneamente perché un cursore e ciclo sono lenti.

Prima che qualcuno mi infastidisca perché inserisco qualcosa in due tabelle separate che hanno una relazione 1 a 1, è perché la prima tabella non può essere modificata e ho bisogno delle informazioni nella seconda tabella (temporanea) come riferimento per i dati operazioni di conversione in seguito.

No, non posso aggiungere una colonna temporanea per contenere i dati di riferimento sulla tabella che non può essere modificata perché non può essere modificata. Questo è un sistema live e non ho i permessi per modificare la tabella.

Grazie!

Informazione supplementare:

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

[Questa risposta è utile?] (Http://stackoverflow.com/q/5365629/73226) –

risposta

0

Con che molti dati, l'opzione migliore potrebbe essere quella di isolare gli aggiornamenti sul sistema, consentirà identity insert e prepoulate le chiavi prima di inserire.


Oppure, si può solo fare il primo inserimento, quindi modificare l'inserto per il secondo (da una tabella temporanea) di aderire a dati originali e trovare la chiave.

+0

Idee fantastiche e grazie, ma ... Non riesco a modificare la prima tabella per consentire l'inserimento dell'identità. La seconda idea sarebbe perfetta ma il motivo per cui ho bisogno della seconda tabella con una chiave esterna per la prima è perché i dati che sto inserendo nella prima non contengono nulla per rendere unico ogni record. La seconda tabella di destinazione contiene essenzialmente l'identità della tabella di origine. Vedi le informazioni aggiuntive che ho aggiunto alla domanda. – AppFzx

+2

Non è necessario * modificare * la tabella per consentire l'inserimento dell'identità - è sufficiente associare l'istruzione di inserimento con SET IDENTITY_INSERT ON e SET IDENTITY_INSERT OFF. –

0

Utilizzare IDENTITY_INSERT, una VISTA e un trigger INSTEAD OF e valori di identità pre-compilati con il proprio inserto.

See this SQL Fiddle.

Ho provato ad agitarsi con varie cose nel trigger INSTEAD OF per consentire l'uso della colonna Identity T1 per T2, ma alla fine ho fallito.

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 

Per il nostro esempio, non posso fare di meglio ...

+0

Ah! Un indice su t1 (dati, id) potrebbe aiutare ... –

1

È possibile utilizzare merge su Table1 ed e output in 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

Nota: SeTable2 ha una chiave esterna definita contro Table1 non si può fare l'output direttamente a Table2. In tal caso è possibile utilizzare una tabella temporanea come destinazione dell'output e inserirla nella tabella temporanea Table2.