2010-02-10 11 views
5

sto usando SQL Server 2005.inserire i dati da una tabella in più tabelle

sto migrando i dati nel corso di un database corrente (tabella singola) per un nuovo database (normalizzate - molti tavoli). Nel nuovo database, ho una tabella di base (chiamiamola "BaseTable") e più altre tabelle (chiamiamole "DependentA" e "DependentB"). Alcuni dati dal vecchio database andranno a BaseTable e altri andranno agli altri due. BaseTable ha una relazione uno-a-uno con DependentA e DependentB, usando l'Id di loro come chiave esterna.

Quindi ecco la mia domanda. Come dovrei migrare i dati? Ecco una query che ho provato, che funziona tranne una cosa: le chiavi esterne in BaseTable per le altre due sono identiche, invece o ne hanno una diversa ciascuna.

Begin SQL: 

BEGIN TRANSACTION 

DECLARE @dep1Id int 

DECLARE @dep2Id int 

INSERT INTO DependentA (column1, column2) 
SELECT c1, c2 
FROM OldDatabase.OldTable 
SELECT @dep1Id = Scope_Identity() 

INSERT INTO DependentB (column3, column4) 
SELECT c3, c4 
FROM OldDatabase.OldTable 
SELECT @dep2Id = Scope_Identity() 

INSERT INTO BaseTable (column5, dependentTable1Id, dependentTablr2Id) 
SELECT c5, @dep1Id, @dep2Id 
FROM OldDatabase.OldTable 

COMMIT 
+0

eseguire una delle colonne nelle tabelle dipendenti sostengono valori unici che potrebbero essere guardato? (vale a dire c1 e c3) – CAbbott

+0

C'è una chiave primaria in quelle tabelle (DependentA e DependentB). – jchapa

risposta

7

Il problema è che @ dep1Id e @ dep1Id sono scalare e sta mantenendo l'ultimo valore solo dalle due inserti set base.

Dal momento che è un'una tantum, probabilmente si dovrebbe fare come un cursore

DECLARE CURSOR @curs FOR 
SELECT c1,c2,c3,c4,c5 FROM OldDatebase 

open @curs 
fetch next from @curs into 
@c1,@c2,@c3,@c4,@c5 --declare these! 

while @@fetch_status <> 0 
BEGIN 

INSERT INTO DependentA (column1, column2) VALUES @c1, @c2 

SELECT @dep1Id = Scope_Identity() 

INSERT INTO DependentB (column3, column4) VALUES @c3, @c4 

SELECT @dep2Id = Scope_Identity() 

INSERT INTO BaseTable (column5, department1Id, department2Id) @c5, @dep1Id, @dep2Id  

fetch next from @curs into 
@c1,@c2,@c3,@c4,@c5 
END 
close @curs 
deallocate @curs 

la mia sintassi cursore è probabilmente pieno di errori, ma si ottiene l'idea.

+0

Ha funzionato. Grazie mille! Questo conclude un progetto di 8 ore. ;) Il cursore – jchapa

+0

non è fattibile per il grande insieme di dati ancora peggiore per me con 261000 righe – Shahdat

4

Per evitare un cursore per set di dati di grandi dimensioni, includere temporaneamente OldTable_id nelle nuove tabelle.

BEGIN TRANSACTION 

INSERT INTO DependentA (OldTable_id, column1, column2) 
SELECT ot.id, ot.c1, ot.c2 
FROM OldDatabase.OldTable ot 

INSERT INTO BaseTable (OldTable_id, column5) 
SELECT ot.id, ot.c5 
FROM OldDatabase.OldTable ot 

UPDATE BaseTable 
    SET BaseTable.dependentTable1_id = DependentA.id 
    FROM BaseTable 
    INNER JOIN DependentA on DependentA.OldTable_id = BaseTable.OldTable_id 

COMMIT 

Fare lo stesso per la tabella DependentB e qualsiasi altra tabella che viene normalizzata da OldTable.

Elimina OldTable_id dopo la migrazione dei dati.

1

[immettere la descrizione dell'immagine qui] [1] ZeorOne è la tabella principale da cui si desidera ottenere i dati e inserirli rispettivamente in zero e in una tabella.

select idzero,namezero,idone,nameone from zeroone 

insert into zero 
select idzero,namezero from zeroone 

insert into one 
select idone,nameone from zeroone 

o se si vuole utilizzare il cursore per inserire i dati con le colonne selezionate da Zeroone in due tabelle la query viene qui

Declare @idzero int 
Declare @namezero varchar(50) 
Declare @idone int 
Declare @nameone varchar(50) 

Declare Cur Cursor for 
select idzero,namezero,idone,nameone from zeroone 

open Cur 

fetch Cur into @idzero,@namezero,@idone,@nameone 

While @@fetch_status = 0 
begin 

    insert into zero 
    select @idzero,@namezero 

    insert into one 
    select @idone,@nameone 

    fetch Cur into @idzero,@namezero,@idone,@nameone 

end 

close Cur 
Deallocate Cur 
+0

Non sono sicuro che questa risposta, a un post di 7 anni aggiunge molto valore al thread ... – Wndrr

Problemi correlati