Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Insertar en tablas relacionadas

36 views
Skip to first unread message

Jos� Antonio Mu�oz

unread,
Nov 25, 2009, 2:30:21 PM11/25/09
to
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.


Carlos Sacristan

unread,
Nov 26, 2009, 5:05:25 AM11/26/09
to
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" <josean...@hotmail.com> wrote in message
news:OV6d9Wgb...@TK2MSFTNGP04.phx.gbl...


> 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.
>
>

José Antonio Muñoz

unread,
Nov 26, 2009, 5:23:57 AM11/26/09
to
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" <nom...@nomail.com> escribi� en el mensaje de noticias
news:ees86$nbKHA...@TK2MSFTNGP04.phx.gbl...

Carlos Sacristan

unread,
Nov 26, 2009, 5:34:06 AM11/26/09
to
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" <josean...@hotmail.com> wrote in message

news:OR2PbKob...@TK2MSFTNGP04.phx.gbl...

0 new messages