2010-02-10 55 views
5

estoy usando SQL Server 2005.insertar datos de una tabla a varias tablas

estoy migrando datos a través de una base de datos actual (tabla individual) a una nueva base de datos (normalizados - muchas mesas). En la nueva base de datos, tengo una tabla base (llamémosla "BaseTable") y varias otras tablas (llamémoslas "DependentA" y "DependentB"). Algunos de los datos de la base de datos anterior irán a BaseTable, y algunos irán a los otros dos. BaseTable tiene una relación de uno a uno con DependentA y DependentB, utilizando Id de ellos como la clave externa.

Así que esta es mi pregunta. ¿Cómo debo migrar los datos? Aquí hay una consulta que he estado intentando, que funciona, excepto por una cosa: las claves foráneas en BaseTable para las otras dos son idénticas, en cambio, o tienen una diferente cada una.

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

¿Alguna de las columnas en las tablas dependientes encierran valores únicos que podían ser buscado? (es decir, c1 y c3) – CAbbott

+0

Hay una clave principal en esas tablas (DependentA y DependentB). – jchapa

Respuesta

7

El problema es que dep1Id @ y @ dep1Id son escalares y se mantiene este último valor sólo de los dos insertos basados ​​conjunto.

Ya que es un fuera probablemente debería hacerlo como un cursor

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 

Mi sintaxis cursor está probablemente plagado de errores, pero usted consigue la idea.

+0

Funcionó. ¡Gracias una tonelada! Eso concluye un proyecto de 8 horas. ;) – jchapa

+0

cursor no es factible para grandes conjuntos de datos, incluso peor para mí con 261000 filas – Shahdat

4

Para evitar un cursor para grandes conjuntos de datos, incluya temporalmente OldTable_id en las nuevas tablas.

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 

Haga lo mismo para la tabla DependentB y cualquier otra tabla que se normalice fuera de la TablaAcc.

Eliminar OldTable_id después de la migración de datos.

1

[Introducir la descripción de la imagen aquí] [1] ZeorOne es la tabla principal de la que desea obtener datos e insertarla en cero y una tabla, respectivamente.

select idzero,namezero,idone,nameone from zeroone 

insert into zero 
select idzero,namezero from zeroone 

insert into one 
select idone,nameone from zeroone 

o si desea utilizar el cursor para insertar datos con columnas seleccionadas de Zeroone en dos mesas de la consulta es aquí

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

No estoy seguro de que esta respuesta a una publicación de 7 años agregue mucho valor al hilo ... – Wndrr

Cuestiones relacionadas