Pregunta

Tengo dos tablas, la primera tiene una clave primaria que es una identidad, la segunda tiene una clave primaria que no lo es, pero esa clave tiene una restricción de clave externa a la clave primaria de la primera tabla.

Si estoy insertando un registro a la vez, puedo usar Scope_Identity para obtener el valor del pk recién insertado en la tabla 1 que quiero insertar en la segunda tabla.

Mi problema es que tengo muchos registros provenientes de selecciones que quiero insertar en ambas tablas, no he podido pensar en una forma basada en conjuntos para hacer estas inserciones.

Mi solución actual es usar un cursor, insertar en la primera tabla, obtener la clave usando scope_identity, insertar en la segunda tabla, repetir.

¿Me estoy perdiendo una solución sin cursor?

¿Fue útil?

Solución

Sí, busque la cláusula de salida en Libros en línea.

Otros consejos

Tuve este problema esta semana: alguien introdujo una tabla con una clave sustituta sin sentido en el esquema donde se usan naturalmente las claves. Sin duda lo arreglaré pronto :) hasta entonces, estoy trabajando en ello creando una tabla de datos para INSERT desde: esta podría ser una tabla base permanente o temporal o una tabla derivada ( ver más abajo), que de todos modos debería satisfacer su deseo de una solución basada en conjuntos. Use una unión entre esta tabla y la tabla con la columna IDENTITY en la clave natural para descubrir los valores generados automáticamente. Aquí hay un breve ejemplo:

CREATE TABLE Test1 
(
 surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
 natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);

CREATE TABLE Test2
(
 surrogate_key INTEGER NOT NULL UNIQUE
    REFERENCES Test1 (surrogate_key), 
 data_col INTEGER NOT NULL
);

INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col);

INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col)
       INNER JOIN Test1 AS T1
          ON T1.natural_key = DT1.natural_key;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top