Insertar en tablas relacionadas

25/11/2009 - 20:30 por José Antonio Muñoz | Informe spam
Hola al grupo,

Tengo dos tablas A (maestra) y B (Detalle) de manera que ambas tablas están
relacionadas a través de un campo ID. El campo ID de la tabla A es índice
único y el campo ID de la tabla B puede repetirse. Necesito insertar
registros desde dos tablas externas que tienen la misma estructura. El
problema radica en generar el mismo ID para ambas tablas destino.

He intentado hacer lo siguiente:

WITH Origen As
(SELECT (select top 1 id from A order by id desc)+Dense_Rank() over (order
by id) As Id, campoA, campoB from tablaexternaA INNER JOIN tablaexternaB ON
tablaexternaA.Id=tablaexternaB.Id)
INSERT A SELECT Id, Max(campoA) FROM Origen GROUP BY Id
INSERT B SELECT Id, campoB FROM Origen

Primero he generado el campo índice ID a partir del último registro de la
tabla maestra A y con la instrucción Dense_Rank() se generan los sucesivos
IDs duplicados de la tabla B. Pero claro la instrucción WITH solo permite
ejecutar un solo INSERT. ¿Como puedo ejecutar el otro INSERT utilizando la
misma consulta Origen? ¿Existe otra manera de hacer esto?

José Antonio Muñoz.
 

Leer las respuestas

#1 Carlos Sacristan
26/11/2009 - 11:05 | Informe spam
Puedes usar la cláusula OUTPUT para saber los registros insertados en la
tabla A. Es decir, algo como:

DECLARE @r TABLE ( id ..., );

; WITH Origen AS (...)
INSERT A
OUTPUT inserted.id, inserted...
INTO @r
SELECT * FROM Origen

INSERT B
SELECT * FROM @r


"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"José Antonio Muñoz" wrote in message
news:
Hola al grupo,

Tengo dos tablas A (maestra) y B (Detalle) de manera que ambas tablas
están relacionadas a través de un campo ID. El campo ID de la tabla A es
índice único y el campo ID de la tabla B puede repetirse. Necesito
insertar registros desde dos tablas externas que tienen la misma
estructura. El problema radica en generar el mismo ID para ambas tablas
destino.

He intentado hacer lo siguiente:

WITH Origen As
(SELECT (select top 1 id from A order by id desc)+Dense_Rank() over
(order by id) As Id, campoA, campoB from tablaexternaA INNER JOIN
tablaexternaB ON tablaexternaA.Id=tablaexternaB.Id)
INSERT A SELECT Id, Max(campoA) FROM Origen GROUP BY Id
INSERT B SELECT Id, campoB FROM Origen

Primero he generado el campo índice ID a partir del último registro de la
tabla maestra A y con la instrucción Dense_Rank() se generan los sucesivos
IDs duplicados de la tabla B. Pero claro la instrucción WITH solo permite
ejecutar un solo INSERT. ¿Como puedo ejecutar el otro INSERT utilizando la
misma consulta Origen? ¿Existe otra manera de hacer esto?

José Antonio Muñoz.


Preguntas similares