AYUDA CON MANEJO DE TABLA DE SECUENCIAS

23/11/2005 - 19:09 por NATHALY_EC | Informe spam
Hola amigos tengo un grave problema necesito hacer un proceso que inserte en
una tabla ciertos datos pero que tome el secuancial para esa tabla de una
tabla de secuencias que guarda el secuancial a tomar.

Tengo esto para tomar el secuencia:
Update tabla_secuancias @secuencia_actual=id_secuencia,
idsecuencia=idsecuancia+1 where tabla=transaccional_personal

@secuencia tiene el secuancial que con el que se va insertar

me dijeron que esto no era sufuciente que tenia que controlar si falla o no
el proceso asi que puse

begin tran insercion
Update tabla_secuancias @secuencia_actual=id_secuencia,
idsecuencia=idsecuancia+1 where tabla=transaccional_personal

if @@error=0
commit tran insercion
else
rollback tran insercion

sin embargo ahora con esto se da a veces que se emite error de constreinst -
key duplicate

y no tengo idea porque...

HELP ALGUIEN ME PUEDE AYUDAR CON ESTO????

muchos usuarios esan esos procesos asi que debo contemplar el bloqueo para
que nadie tome el secuancial repetido
quee stoy haciendo mal... ayuda

de antemano gracias..

saludos,

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
23/11/2005 - 19:29 | Informe spam
NATHALY_EC,

Yo te recomiendo que no trates de hacer dos operaciones al mismo tiempo,
tomar valor actual e incrementar. Crea un sp que incremente el valor en uno y
te devuelva ese nuevo valor como secuencia a insertar.

create table t1 (
c1 int not null primary key check (c1 >= 0) default (0)
)
go

insert into t1 default values
go

create procedure dbo.p1
@nuevo_valor int output
as
set nocount on

update t1
set @nuevo_valor = c1 = c1 + 1

return @@error
go

declare @i int
declare @j int
declare @rv int

set @j = 1

while @j < 10
begin

exec @v = dbo.p1 @i output

if @rv = 0 and @@error = 0
insert into t1 values(@i)
else
print 'error cojiendo proximo valor'

set @j = @j + 1

end

select * from t1
go

drop procedure dbo.p1
go

drop table t1
go


AMB

"NATHALY_EC" wrote:

Hola amigos tengo un grave problema necesito hacer un proceso que inserte en
una tabla ciertos datos pero que tome el secuancial para esa tabla de una
tabla de secuencias que guarda el secuancial a tomar.

Tengo esto para tomar el secuencia:
Update tabla_secuancias @secuencia_actual=id_secuencia,
idsecuencia=idsecuancia+1 where tabla=transaccional_personal

@secuencia tiene el secuancial que con el que se va insertar

me dijeron que esto no era sufuciente que tenia que controlar si falla o no
el proceso asi que puse

begin tran insercion
Update tabla_secuancias @secuencia_actual=id_secuencia,
idsecuencia=idsecuancia+1 where tabla=transaccional_personal

if @@error=0
commit tran insercion
else
rollback tran insercion

sin embargo ahora con esto se da a veces que se emite error de constreinst -
key duplicate

y no tengo idea porque...

HELP ALGUIEN ME PUEDE AYUDAR CON ESTO????

muchos usuarios esan esos procesos asi que debo contemplar el bloqueo para
que nadie tome el secuancial repetido
quee stoy haciendo mal... ayuda

de antemano gracias..

saludos,

Respuesta Responder a este mensaje
#2 NATHALY_EC
23/11/2005 - 20:05 | Informe spam
garcias Alejandro por tu respuesta pero te comento otro problema adicional a
este es que mis dos bases de datos estan en servidores diferentes.


"Alejandro Mesa" wrote:

NATHALY_EC,

Yo te recomiendo que no trates de hacer dos operaciones al mismo tiempo,
tomar valor actual e incrementar. Crea un sp que incremente el valor en uno y
te devuelva ese nuevo valor como secuencia a insertar.

create table t1 (
c1 int not null primary key check (c1 >= 0) default (0)
)
go

insert into t1 default values
go

create procedure dbo.p1
@nuevo_valor int output
as
set nocount on

update t1
set @nuevo_valor = c1 = c1 + 1

return @@error
go

declare @i int
declare @j int
declare @rv int

set @j = 1

while @j < 10
begin

exec @v = dbo.p1 @i output

if @rv = 0 and @@error = 0
insert into t1 values(@i)
else
print 'error cojiendo proximo valor'

set @j = @j + 1

end

select * from t1
go

drop procedure dbo.p1
go

drop table t1
go


AMB

"NATHALY_EC" wrote:

> Hola amigos tengo un grave problema necesito hacer un proceso que inserte en
> una tabla ciertos datos pero que tome el secuancial para esa tabla de una
> tabla de secuencias que guarda el secuancial a tomar.
>
> Tengo esto para tomar el secuencia:
> Update tabla_secuancias @secuencia_actual=id_secuencia,
> idsecuencia=idsecuancia+1 where tabla=transaccional_personal
>
> @secuencia tiene el secuancial que con el que se va insertar
>
> me dijeron que esto no era sufuciente que tenia que controlar si falla o no
> el proceso asi que puse
>
> begin tran insercion
> Update tabla_secuancias @secuencia_actual=id_secuencia,
> idsecuencia=idsecuancia+1 where tabla=transaccional_personal
>
> if @@error=0
> commit tran insercion
> else
> rollback tran insercion
>
> sin embargo ahora con esto se da a veces que se emite error de constreinst -
> key duplicate
>
> y no tengo idea porque...
>
> HELP ALGUIEN ME PUEDE AYUDAR CON ESTO????
>
> muchos usuarios esan esos procesos asi que debo contemplar el bloqueo para
> que nadie tome el secuancial repetido
> quee stoy haciendo mal... ayuda
>
> de antemano gracias..
>
> saludos,
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
23/11/2005 - 20:27 | Informe spam
NATHALY_EC,

Ya ves lo que pasa cuando los problemas se comentan de a poquito. Pues
tendras que encerrar todo en una transaccion distribuida.

Por cierto, olvide poner yo la llamada al sp y el insert dentro de una
transaccion.

declare @i int
declare @j int
declare @rv int

set @j = 1

while @j < 10
begin

begin transaction

exec @v = dbo.p1 @i output

if @rv = 0 and @@error = 0
begin
insert into t1 values(@i)
if @@error > 0
rollback transaction
else
commit transaction

end
else
begin
rollback transaction
print 'error cojiendo proximo valor'
end

set @j = @j + 1

end


En caso de que el sp este en otra base en otro servidor, ambos servidores
deberan tener prendido MS-DTC y encerrar la transaccion, como dije antes, en
una transaccion distribuida. Para ejecutar el sp en el otro servidor, debes
crear primero un "linked server", ve sp_addlinkedserver en los libros en
linea.

declare @i int
declare @j int
declare @rv int

set @j = 1

while @j < 10
begin

begin distributed transaction

set @i = null
exec @rv = mi_linkedserver.mi_db.dbo.p1 @i output

if @rv = 0 and @@error = 0 and @i is not null
begin
insert into t1 values(@i)
if @@error > 0
rollback transaction
else
commit transaction

end
else
begin
rollback transaction
print 'error cojiendo proximo valor'
end

set @j = @j + 1

end
go


AMB


"NATHALY_EC" wrote:

garcias Alejandro por tu respuesta pero te comento otro problema adicional a
este es que mis dos bases de datos estan en servidores diferentes.


"Alejandro Mesa" wrote:

> NATHALY_EC,
>
> Yo te recomiendo que no trates de hacer dos operaciones al mismo tiempo,
> tomar valor actual e incrementar. Crea un sp que incremente el valor en uno y
> te devuelva ese nuevo valor como secuencia a insertar.
>
> create table t1 (
> c1 int not null primary key check (c1 >= 0) default (0)
> )
> go
>
> insert into t1 default values
> go
>
> create procedure dbo.p1
> @nuevo_valor int output
> as
> set nocount on
>
> update t1
> set @nuevo_valor = c1 = c1 + 1
>
> return @@error
> go
>
> declare @i int
> declare @j int
> declare @rv int
>
> set @j = 1
>
> while @j < 10
> begin
>
> exec @v = dbo.p1 @i output
>
> if @rv = 0 and @@error = 0
> insert into t1 values(@i)
> else
> print 'error cojiendo proximo valor'
>
> set @j = @j + 1
>
> end
>
> select * from t1
> go
>
> drop procedure dbo.p1
> go
>
> drop table t1
> go
>
>
> AMB
>
> "NATHALY_EC" wrote:
>
> > Hola amigos tengo un grave problema necesito hacer un proceso que inserte en
> > una tabla ciertos datos pero que tome el secuancial para esa tabla de una
> > tabla de secuencias que guarda el secuancial a tomar.
> >
> > Tengo esto para tomar el secuencia:
> > Update tabla_secuancias @secuencia_actual=id_secuencia,
> > idsecuencia=idsecuancia+1 where tabla=transaccional_personal
> >
> > @secuencia tiene el secuancial que con el que se va insertar
> >
> > me dijeron que esto no era sufuciente que tenia que controlar si falla o no
> > el proceso asi que puse
> >
> > begin tran insercion
> > Update tabla_secuancias @secuencia_actual=id_secuencia,
> > idsecuencia=idsecuancia+1 where tabla=transaccional_personal
> >
> > if @@error=0
> > commit tran insercion
> > else
> > rollback tran insercion
> >
> > sin embargo ahora con esto se da a veces que se emite error de constreinst -
> > key duplicate
> >
> > y no tengo idea porque...
> >
> > HELP ALGUIEN ME PUEDE AYUDAR CON ESTO????
> >
> > muchos usuarios esan esos procesos asi que debo contemplar el bloqueo para
> > que nadie tome el secuancial repetido
> > quee stoy haciendo mal... ayuda
> >
> > de antemano gracias..
> >
> > saludos,
> >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida