Ayuda con un insert - select

27/11/2006 - 16:23 por jpablos | Informe spam
Saludos .

Yo tenia una instruccion sql de la siguiente manera:

declare @codigo_empresa_origen numeric,
@codigo_empresa_destino numeric

select @codigo_empresa_origen = 1, @codigo_empresa_destino = 148

insert into
gtge_personas(codigo_empresa,identificacion,nombre,tipo_identificacion)
select @codigo_empresa_destino,a.identificacion,a.nombre,a.tipo_identificacion
from gtge_personas a
where a.codigo_empresa = @codigo_empresa_origen
and not exists(select b.identificacion from gtge_personas as b where
b.codigo_empresa = @codigo_empresa_destino and b.identificacion =
a.identificacion)
order by a.nombre

Que lo que hacia es insertarme en la tabla gtge_personas todas las personas
que estaban en la empresa origen y que no se encontraban en la empresa de
destino, el codigo de las personas era de tipo identity por lo que al
insertarse se incrementaba en uno automaticamente, pero se hicieron cambios
en las tablas y el campo que antes era identity ahora ya no lo es por lo que
cuando se crea una persona se busca el maximo codigo y se le suma 1, como
puedo hacer en el select de arriba se inserte el codigo de la persona que
antes era de tipo identity y ahora no lo es ?????

Gracias ..

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
27/11/2006 - 17:04 | Informe spam
jpablos,

Ese es uno de los contras que se tiene cuando se usa una columna que se
numera mediante un procedimiento almacenado, se pierde la posibilidad de
hacer inserciones en masa. La unica forma sera insertarlos de uno en uno,
fila a fila, usando un cursor o un lazo.

AMB


"jpablos" wrote:

Saludos .

Yo tenia una instruccion sql de la siguiente manera:

declare @codigo_empresa_origen numeric,
@codigo_empresa_destino numeric

select @codigo_empresa_origen = 1, @codigo_empresa_destino = 148

insert into
gtge_personas(codigo_empresa,identificacion,nombre,tipo_identificacion)
select @codigo_empresa_destino,a.identificacion,a.nombre,a.tipo_identificacion
from gtge_personas a
where a.codigo_empresa = @codigo_empresa_origen
and not exists(select b.identificacion from gtge_personas as b where
b.codigo_empresa = @codigo_empresa_destino and b.identificacion =
a.identificacion)
order by a.nombre

Que lo que hacia es insertarme en la tabla gtge_personas todas las personas
que estaban en la empresa origen y que no se encontraban en la empresa de
destino, el codigo de las personas era de tipo identity por lo que al
insertarse se incrementaba en uno automaticamente, pero se hicieron cambios
en las tablas y el campo que antes era identity ahora ya no lo es por lo que
cuando se crea una persona se busca el maximo codigo y se le suma 1, como
puedo hacer en el select de arriba se inserte el codigo de la persona que
antes era de tipo identity y ahora no lo es ?????

Gracias ..
Respuesta Responder a este mensaje
#2 Monica Rivera
27/11/2006 - 19:16 | Informe spam
Puede que no sea la mejor solucion, pero funciona. Creando una tabla temporal
con un campo identidad y dinamicamente asignandole el seed, se puede.
Trate de usar una variable de tipo tabla,pero desafortunadamente no se le
puede pasar el seed mediante una variable...
Aqui va, asume que el codigo de la persona es una campo llamado
codigo_persona en la tabla gtge_personas:

declare @codigo_empresa_origen numeric,
@codigo_empresa_destino numeric,
@primer_codigopersona int,
@sql varchar(1000)

select @codigo_empresa_origen = 1, @codigo_empresa_destino =
148,@primer_codigopersona=max(codigo_persona)+1 from gtge_personas

set @sql='create table ##personas (id int identity(' +
convert(varchar(10),@primer_codigopersona)
set @sql=@sql+',1),codigo_empresa_destino int,identificacion char(10),nombre
char(30),tipo_identificacion int)'
exec (@sql)

insert into ##personas
(codigo_empresa_destino,identificacion,nombre,tipo_identificacion)
select
@codigo_empresa_destino,
a.identificacion,
a.nombre,
a.tipo_identificacion

from gtge_personas a

where a.codigo_empresa = @codigo_empresa_origen
and not exists(select b.identificacion from gtge_personas as b
where
b.codigo_empresa = @codigo_empresa_destino and
b.identificacion = a.identificacion)
order by a.nombre

insert into gtge_personas(
codigo_persona,
codigo_empresa,
identificacion,
nombre,
tipo_identificacion)
select id,codigo_empresa_destino,identificacion,nombre,tipo_identificacion
from ##personas

drop table ##personas


"Alejandro Mesa" wrote:

jpablos,

Ese es uno de los contras que se tiene cuando se usa una columna que se
numera mediante un procedimiento almacenado, se pierde la posibilidad de
hacer inserciones en masa. La unica forma sera insertarlos de uno en uno,
fila a fila, usando un cursor o un lazo.

AMB


"jpablos" wrote:

> Saludos .
>
> Yo tenia una instruccion sql de la siguiente manera:
>
> declare @codigo_empresa_origen numeric,
> @codigo_empresa_destino numeric
>
> select @codigo_empresa_origen = 1, @codigo_empresa_destino = 148
>
> insert into
> gtge_personas(codigo_empresa,identificacion,nombre,tipo_identificacion)
> select @codigo_empresa_destino,a.identificacion,a.nombre,a.tipo_identificacion
> from gtge_personas a
> where a.codigo_empresa = @codigo_empresa_origen
> and not exists(select b.identificacion from gtge_personas as b where
> b.codigo_empresa = @codigo_empresa_destino and b.identificacion =
> a.identificacion)
> order by a.nombre
>
> Que lo que hacia es insertarme en la tabla gtge_personas todas las personas
> que estaban en la empresa origen y que no se encontraban en la empresa de
> destino, el codigo de las personas era de tipo identity por lo que al
> insertarse se incrementaba en uno automaticamente, pero se hicieron cambios
> en las tablas y el campo que antes era identity ahora ya no lo es por lo que
> cuando se crea una persona se busca el maximo codigo y se le suma 1, como
> puedo hacer en el select de arriba se inserte el codigo de la persona que
> antes era de tipo identity y ahora no lo es ?????
>
> Gracias ..
Respuesta Responder a este mensaje
#3 Alejandro Mesa
27/11/2006 - 19:22 | Informe spam
Monica,

Ejecuta ese script en dos conxiones dieferentes y al mismo tiempo, veras lo
que ocurre.


AMB


"Monica Rivera" wrote:

Puede que no sea la mejor solucion, pero funciona. Creando una tabla temporal
con un campo identidad y dinamicamente asignandole el seed, se puede.
Trate de usar una variable de tipo tabla,pero desafortunadamente no se le
puede pasar el seed mediante una variable...
Aqui va, asume que el codigo de la persona es una campo llamado
codigo_persona en la tabla gtge_personas:

declare @codigo_empresa_origen numeric,
@codigo_empresa_destino numeric,
@primer_codigopersona int,
@sql varchar(1000)

select @codigo_empresa_origen = 1, @codigo_empresa_destino =
148,@primer_codigopersona=max(codigo_persona)+1 from gtge_personas

set @sql='create table ##personas (id int identity(' +
convert(varchar(10),@primer_codigopersona)
set @sql=@sql+',1),codigo_empresa_destino int,identificacion char(10),nombre
char(30),tipo_identificacion int)'
exec (@sql)

insert into ##personas
(codigo_empresa_destino,identificacion,nombre,tipo_identificacion)
select
@codigo_empresa_destino,
a.identificacion,
a.nombre,
a.tipo_identificacion

from gtge_personas a

where a.codigo_empresa = @codigo_empresa_origen
and not exists(select b.identificacion from gtge_personas as b
where
b.codigo_empresa = @codigo_empresa_destino and
b.identificacion = a.identificacion)
order by a.nombre

insert into gtge_personas(
codigo_persona,
codigo_empresa,
identificacion,
nombre,
tipo_identificacion)
select id,codigo_empresa_destino,identificacion,nombre,tipo_identificacion
from ##personas

drop table ##personas


"Alejandro Mesa" wrote:

> jpablos,
>
> Ese es uno de los contras que se tiene cuando se usa una columna que se
> numera mediante un procedimiento almacenado, se pierde la posibilidad de
> hacer inserciones en masa. La unica forma sera insertarlos de uno en uno,
> fila a fila, usando un cursor o un lazo.
>
> AMB
>
>
> "jpablos" wrote:
>
> > Saludos .
> >
> > Yo tenia una instruccion sql de la siguiente manera:
> >
> > declare @codigo_empresa_origen numeric,
> > @codigo_empresa_destino numeric
> >
> > select @codigo_empresa_origen = 1, @codigo_empresa_destino = 148
> >
> > insert into
> > gtge_personas(codigo_empresa,identificacion,nombre,tipo_identificacion)
> > select @codigo_empresa_destino,a.identificacion,a.nombre,a.tipo_identificacion
> > from gtge_personas a
> > where a.codigo_empresa = @codigo_empresa_origen
> > and not exists(select b.identificacion from gtge_personas as b where
> > b.codigo_empresa = @codigo_empresa_destino and b.identificacion =
> > a.identificacion)
> > order by a.nombre
> >
> > Que lo que hacia es insertarme en la tabla gtge_personas todas las personas
> > que estaban en la empresa origen y que no se encontraban en la empresa de
> > destino, el codigo de las personas era de tipo identity por lo que al
> > insertarse se incrementaba en uno automaticamente, pero se hicieron cambios
> > en las tablas y el campo que antes era identity ahora ya no lo es por lo que
> > cuando se crea una persona se busca el maximo codigo y se le suma 1, como
> > puedo hacer en el select de arriba se inserte el codigo de la persona que
> > antes era de tipo identity y ahora no lo es ?????
> >
> > Gracias ..
Respuesta Responder a este mensaje
#4 Monica Rivera
27/11/2006 - 19:33 | Informe spam
Lo se. No es ideal para conecciones simultaneas.

"Alejandro Mesa" wrote:

Monica,

Ejecuta ese script en dos conxiones dieferentes y al mismo tiempo, veras lo
que ocurre.


AMB


"Monica Rivera" wrote:

> Puede que no sea la mejor solucion, pero funciona. Creando una tabla temporal
> con un campo identidad y dinamicamente asignandole el seed, se puede.
> Trate de usar una variable de tipo tabla,pero desafortunadamente no se le
> puede pasar el seed mediante una variable...
> Aqui va, asume que el codigo de la persona es una campo llamado
> codigo_persona en la tabla gtge_personas:
>
> declare @codigo_empresa_origen numeric,
> @codigo_empresa_destino numeric,
> @primer_codigopersona int,
> @sql varchar(1000)
>
> select @codigo_empresa_origen = 1, @codigo_empresa_destino =
> 148,@primer_codigopersona=max(codigo_persona)+1 from gtge_personas
>
> set @sql='create table ##personas (id int identity(' +
> convert(varchar(10),@primer_codigopersona)
> set @sql=@sql+',1),codigo_empresa_destino int,identificacion char(10),nombre
> char(30),tipo_identificacion int)'
> exec (@sql)
>
> insert into ##personas
> (codigo_empresa_destino,identificacion,nombre,tipo_identificacion)
> select
> @codigo_empresa_destino,
> a.identificacion,
> a.nombre,
> a.tipo_identificacion
>
> from gtge_personas a
>
> where a.codigo_empresa = @codigo_empresa_origen
> and not exists(select b.identificacion from gtge_personas as b
> where
> b.codigo_empresa = @codigo_empresa_destino and
> b.identificacion = a.identificacion)
> order by a.nombre
>
> insert into gtge_personas(
> codigo_persona,
> codigo_empresa,
> identificacion,
> nombre,
> tipo_identificacion)
> select id,codigo_empresa_destino,identificacion,nombre,tipo_identificacion
> from ##personas
>
> drop table ##personas
>
>
> "Alejandro Mesa" wrote:
>
> > jpablos,
> >
> > Ese es uno de los contras que se tiene cuando se usa una columna que se
> > numera mediante un procedimiento almacenado, se pierde la posibilidad de
> > hacer inserciones en masa. La unica forma sera insertarlos de uno en uno,
> > fila a fila, usando un cursor o un lazo.
> >
> > AMB
> >
> >
> > "jpablos" wrote:
> >
> > > Saludos .
> > >
> > > Yo tenia una instruccion sql de la siguiente manera:
> > >
> > > declare @codigo_empresa_origen numeric,
> > > @codigo_empresa_destino numeric
> > >
> > > select @codigo_empresa_origen = 1, @codigo_empresa_destino = 148
> > >
> > > insert into
> > > gtge_personas(codigo_empresa,identificacion,nombre,tipo_identificacion)
> > > select @codigo_empresa_destino,a.identificacion,a.nombre,a.tipo_identificacion
> > > from gtge_personas a
> > > where a.codigo_empresa = @codigo_empresa_origen
> > > and not exists(select b.identificacion from gtge_personas as b where
> > > b.codigo_empresa = @codigo_empresa_destino and b.identificacion =
> > > a.identificacion)
> > > order by a.nombre
> > >
> > > Que lo que hacia es insertarme en la tabla gtge_personas todas las personas
> > > que estaban en la empresa origen y que no se encontraban en la empresa de
> > > destino, el codigo de las personas era de tipo identity por lo que al
> > > insertarse se incrementaba en uno automaticamente, pero se hicieron cambios
> > > en las tablas y el campo que antes era identity ahora ya no lo es por lo que
> > > cuando se crea una persona se busca el maximo codigo y se le suma 1, como
> > > puedo hacer en el select de arriba se inserte el codigo de la persona que
> > > antes era de tipo identity y ahora no lo es ?????
> > >
> > > Gracias ..
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida