2010-07-14 17 views
7

Voy a dar un ejemplo de pseudocódigo de mi método actual y si alguien sabe de un método que no funciona una fila a la vez, estaría muy agradecido. Estoy usando MS SQL Server 2008.¿Hay alguna forma de insertar a granel en dos tablas con FK de una a la otra?

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 
) 

yo preferiría hacer algún tipo de inserción en las dos mesas a la vez, porque un cursor y bucle son lentos.

Antes de que alguien diga por qué estoy insertando algo en dos tablas separadas que tienen una relación de 1 a 1, es porque la primera tabla no se puede modificar y necesito la información en la segunda tabla (temporal) para referencia de datos operaciones de conversión más adelante.

No, no puedo agregar una columna temporal para mantener los datos de referencia en la tabla que no se pueden modificar porque no se pueden modificar. Este es un sistema en vivo y no tengo permisos para alterar la tabla.

Gracias!

Información adicional:

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

[¿Ayuda esta respuesta?] (Http://stackoverflow.com/q/5365629/73226) –

Respuesta

0

Con tantos datos, la mejor opción podría ser la de aislar cambios en el sistema, permitirá identity insert y prepoulate las llaves antes de la inserción.


O bien, puede que acaba de hacer la primera inserción, a continuación, modificar el inserto para el segundo (de una tabla temporal) para unirse a los datos originales y encontrar la llave.

+0

Excelentes ideas y gracias, pero ... No puedo modificar la primera tabla para permitir la inserción de identidad. La segunda idea sería perfecta, pero la razón por la que necesito la segunda tabla con una clave externa para la primera es porque los datos que estoy insertando en la primera no contienen nada para que cada registro sea único. La segunda tabla de destino contendría esencialmente la identidad de la tabla de origen. Ver información adicional que agregué a la pregunta. – AppFzx

+2

No necesita * modificar * la tabla para permitir la inserción de identidad; solo necesita poner entre paréntesis su instrucción de inserción con SET IDENTITY_INSERT ON y SET IDENTITY_INSERT OFF. –

0

Use IDENTITY_INSERT, una vista y un ENTRADA de activador, y valores de identidad prepoblados con su inserción.

See this SQL Fiddle.

Intenté dar vueltas con varias cosas en el disparador INSTEAD OF para permitir que la columna de identidad del T1 se usara para T2, pero al final fallé.

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 

Para el ejemplo dado, no puedo hacerlo mejor ...

+0

¡Ah! Un índice en t1 (datos, identificación) podría ayudar ... –

1

Usted puede utilizar merge en Table1 y output y en 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: SiTable2 tiene una clave externa definida contra Table1 no se puede hacer la salida directamente a Table2. En ese caso, puede usar una tabla temporal como destino de la salida e insertarla en Table2 desde la tabla temporal.

Cuestiones relacionadas