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.

Preguntas similare

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.


Respuesta Responder a este mensaje
#2 José Antonio Muñoz
26/11/2009 - 11:23 | Informe spam
Pero la tabla A no tiene los mismos campos que la tabla B, es decir, A tiene
Id y CampoA y B tiene Id y CampoB, por tanto el INSERT me dice que la tabla
destino no tiene lo mismos campos que el resultado de la consulta origen. Si
en el SELECT * FROM Origen pongo solo los campos de la tabla A (SELECT Id,
CampoA FROM Origen) ¿luego como inserto el campoB en la tabla B?

saludos,
José Antonio Muñoz

"Carlos Sacristan" escribió en el mensaje de noticias
news:ees86$
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.





Respuesta Responder a este mensaje
#3 Carlos Sacristan
26/11/2009 - 11:34 | Informe spam
Perdona, había entendido el problema mal.

Bueno, la solución es usar una tabla temporal intermedia para almacenar los
resultados de la CTE. Algo como

DECLARE @r TABLE (id <tipoDatos>, campoA <tipoDatos>, campoB
<tipoDatos>);

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 @r
SELECT * FROM Origen;

INSERT A
SELECT id, campoA
FROM @r;

INSERT B
SELECT id, campoB
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:
Pero la tabla A no tiene los mismos campos que la tabla B, es decir, A
tiene Id y CampoA y B tiene Id y CampoB, por tanto el INSERT me dice que
la tabla destino no tiene lo mismos campos que el resultado de la consulta
origen. Si en el SELECT * FROM Origen pongo solo los campos de la tabla A
(SELECT Id, CampoA FROM Origen) ¿luego como inserto el campoB en la tabla
B?

saludos,
José Antonio Muñoz

"Carlos Sacristan" escribió en el mensaje de noticias
news:ees86$
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.








email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida