Porque no genera un numero unico?

01/09/2005 - 01:11 por Claudio | Informe spam
Hola,

Cree una SP que inserta datos en una tabla y por cada grupo de datos que
graba, genera un identificador unico para ese grupo.

Tengo un problema que cuando 2 o mas pcs ejecutan el proceso al mismo
tiempo, no genera un unico numero si no que se repite, y por consiguiente da
error

Vean el codigo:

BEGIN TRANSACTION

Select @IDPROCESS=(select isnull(max(ID),0)+1 From tabla1)

INSERT INTO Tabla1
select @IDPROCESS,* from temporal#

COMMIT TRANSACTION

DROPT TABLE TEMPORAL#

No se supone que entre el begin transaction y el commit, "tabla1" queda
temporariamente bloqueada ??? o es solo para insertar y deletar???

Como soluciono ese problema para que si o si genere un ID unico no importa
cuantos procesos esten accediendo a la tabla ????????


Tambien probe de la siguiente forma, creando una tabla con un contador y un
stored procedure extra para generar el numero, pero tampoco funciona!!

BEGIN TRANSACTION
Exec gereasynum @IDPROCESS output

INSERT INTO Tabla1
select @IDPROCESS,* from temporal#

COMMIT TRANSACTION

Y la procedure que genera el numero:

ALTER procedure GerEASYNum
/*

*/
@OUT_Registro FLOAT OUTPUT

AS
Begin
BEGIN TRANSACTION

select @out_registro=(select count(*) from contador)

If @out_registro=0
begin
Insert INTO CONTADOR
(counter1) values(0)
end

Select @OUT_Registro=(select isnull(max(counter1),0)+1 From contador)

UPDATE CONTADOR
SET counter1=@out_registro
COMMIT TRANSACTION

END

Gracias,

Claudio.

Preguntas similare

Leer las respuestas

#1 Claudio
01/09/2005 - 01:17 | Informe spam
ALTER procedure GerEASYNum
/*

*/
@OUT_Registro FLOAT OUTPUT

AS
Begin
BEGIN TRANSACTION

select @out_registro=(select count(*) from contador)

If @out_registro=0
begin
Insert INTO CONTADOR
(counter1) values(0)
end

Select @OUT_Registro=(select counter1+1 From contador)

UPDATE CONTADOR
SET counter1=@out_registro
COMMIT TRANSACTION

END
Respuesta Responder a este mensaje
#2 Maxi
01/09/2005 - 02:15 | Informe spam
Hola, el tema es que no estas bloqueando nada ya que el Select asi como esta
no bloquea

Te recomiendo que leas este articulo mio donde explico como hacer estas
cosas

http://www.microsoft.com/spanish/ms...art187.asp


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Claudio" escribió en el mensaje
news:
Hola,

Cree una SP que inserta datos en una tabla y por cada grupo de datos que
graba, genera un identificador unico para ese grupo.

Tengo un problema que cuando 2 o mas pcs ejecutan el proceso al mismo
tiempo, no genera un unico numero si no que se repite, y por consiguiente
da
error

Vean el codigo:

BEGIN TRANSACTION

Select @IDPROCESS=(select isnull(max(ID),0)+1 From tabla1)

INSERT INTO Tabla1
select @IDPROCESS,* from temporal#

COMMIT TRANSACTION

DROPT TABLE TEMPORAL#

No se supone que entre el begin transaction y el commit, "tabla1" queda
temporariamente bloqueada ??? o es solo para insertar y deletar???

Como soluciono ese problema para que si o si genere un ID unico no importa
cuantos procesos esten accediendo a la tabla ????????


Tambien probe de la siguiente forma, creando una tabla con un contador y
un
stored procedure extra para generar el numero, pero tampoco funciona!!

BEGIN TRANSACTION
Exec gereasynum @IDPROCESS output

INSERT INTO Tabla1
select @IDPROCESS,* from temporal#

COMMIT TRANSACTION

Y la procedure que genera el numero:

ALTER procedure GerEASYNum
/*

*/
@OUT_Registro FLOAT OUTPUT

AS
Begin
BEGIN TRANSACTION

select @out_registro=(select count(*) from contador)

If @out_registro=0
begin
Insert INTO CONTADOR
(counter1) values(0)
end

Select @OUT_Registro=(select isnull(max(counter1),0)+1 From contador)

UPDATE CONTADOR
SET counter1=@out_registro
COMMIT TRANSACTION

END

Gracias,

Claudio.


Respuesta Responder a este mensaje
#3 Eleazar
01/09/2005 - 02:28 | Informe spam
no te sirve el campo Id hacerlo identity

"Claudio" escribió en el mensaje
news:eyA%
ALTER procedure GerEASYNum
/*

*/
@OUT_Registro FLOAT OUTPUT

AS
Begin
BEGIN TRANSACTION

select @out_registro=(select count(*) from contador)

If @out_registro=0
begin
Insert INTO CONTADOR
(counter1) values(0)
end

Select @OUT_Registro=(select counter1+1 From contador)

UPDATE CONTADOR
SET counter1=@out_registro
COMMIT TRANSACTION

END


Respuesta Responder a este mensaje
#4 Claudio
01/09/2005 - 19:03 | Informe spam
No, porque el identity es 1 diferente para cada registro y yo preciso uno
para un grupo...


"Eleazar" wrote in message
news:#
no te sirve el campo Id hacerlo identity

"Claudio" escribió en el mensaje
news:eyA%
> ALTER procedure GerEASYNum
> /*
>
> */
> @OUT_Registro FLOAT OUTPUT
>
> AS
> Begin
> BEGIN TRANSACTION
>
> select @out_registro=(select count(*) from contador)
>
> If @out_registro=0
> begin
> Insert INTO CONTADOR
> (counter1) values(0)
> end
>
> Select @OUT_Registro=(select counter1+1 From contador)
>
> UPDATE CONTADOR
> SET counter1=@out_registro
> COMMIT TRANSACTION
>
> END
>
>


Respuesta Responder a este mensaje
#5 Claudio
01/09/2005 - 19:04 | Informe spam
Gracias, lo voy a ver...



"Maxi" wrote in message
news:
Hola, el tema es que no estas bloqueando nada ya que el Select asi como


esta
no bloquea

Te recomiendo que leas este articulo mio donde explico como hacer estas
cosas

http://www.microsoft.com/spanish/ms...art187.asp


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Claudio" escribió en el mensaje
news:
> Hola,
>
> Cree una SP que inserta datos en una tabla y por cada grupo de datos que
> graba, genera un identificador unico para ese grupo.
>
> Tengo un problema que cuando 2 o mas pcs ejecutan el proceso al mismo
> tiempo, no genera un unico numero si no que se repite, y por


consiguiente
> da
> error
>
> Vean el codigo:
>
> BEGIN TRANSACTION
>
> Select @IDPROCESS=(select isnull(max(ID),0)+1 From tabla1)
>
> INSERT INTO Tabla1
> select @IDPROCESS,* from temporal#
>
> COMMIT TRANSACTION
>
> DROPT TABLE TEMPORAL#
>
> No se supone que entre el begin transaction y el commit, "tabla1" queda
> temporariamente bloqueada ??? o es solo para insertar y deletar???
>
> Como soluciono ese problema para que si o si genere un ID unico no


importa
> cuantos procesos esten accediendo a la tabla ????????
>
>
> Tambien probe de la siguiente forma, creando una tabla con un contador y
> un
> stored procedure extra para generar el numero, pero tampoco funciona!!
>
> BEGIN TRANSACTION
> Exec gereasynum @IDPROCESS output
>
> INSERT INTO Tabla1
> select @IDPROCESS,* from temporal#
>
> COMMIT TRANSACTION
>
> Y la procedure que genera el numero:
>
> ALTER procedure GerEASYNum
> /*
>
> */
> @OUT_Registro FLOAT OUTPUT
>
> AS
> Begin
> BEGIN TRANSACTION
>
> select @out_registro=(select count(*) from contador)
>
> If @out_registro=0
> begin
> Insert INTO CONTADOR
> (counter1) values(0)
> end
>
> Select @OUT_Registro=(select isnull(max(counter1),0)+1 From contador)
>
> UPDATE CONTADOR
> SET counter1=@out_registro
> COMMIT TRANSACTION
>
> END
>
> Gracias,
>
> Claudio.
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida