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.
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.
>
>
saludos,
Jos� Antonio Mu�oz
"Carlos Sacristan" <nom...@nomail.com> escribi� en el mensaje de noticias
news:ees86$nbKHA...@TK2MSFTNGP04.phx.gbl...
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...