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

#6 Paulino Padial
02/09/2005 - 18:04 | Informe spam
Podrias bloquear la tabla ( no me carguis xD )... de esa forma al insertar
al mismo tiempo se tendra qeu esperar... ( eso si kieres seguir el orden
numerico de que sea el id uno mas... ) si no puedes usar un GUID o
identificador unico.

"Claudio" escribió en el mensaje
news:
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
#7 Paulino Padial
02/09/2005 - 18:05 | Informe spam
maldito out, no me mostró el resto de la conversación! yo tb voy a leer tu
articulo, maxi :)


"Claudio" escribió en el mensaje
news:
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
#8 Maxi
02/09/2005 - 18:20 | Informe spam
Espero te guste ;-)


Salu2
Maxi


"Paulino Padial" escribió en el mensaje
news:
maldito out, no me mostró el resto de la conversación! yo tb voy a leer tu
articulo, maxi :)


"Claudio" escribió en el mensaje
news:
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
>
>










email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida