no autoincrementar clave primaria despues de un roolback

15/06/2007 - 15:30 por maxiperez | Informe spam
Hola!
tengo una tabla con la clave primaria autonumerica. si intento hacer un
insert y este falla, el proximo insert correcto me guarda el registro con un
salto numerico.
Por ejemplo:

registros existentes:
1-pepe
2-juan
3-lola

'insert falla y hago rollback
'otro insert falla y otro hago rollback
'proximo inser es correcto, y la clave es

6-manuel

¿porque no se guardo la clave con el valor 4 ?
¿hay alguna manera de que el SQL server no haga este salto autonumerico?

Preguntas similare

Leer las respuestas

#1 Federico A Colli
15/06/2007 - 15:38 | Informe spam
No, pero podes restablecer la clave, nor ecuerdo la función requerida así
que alguien con mayores conocimientos lo dirá.

De todas formas, no te recomiendo ahcer esto, dado que en el uso concurrente
varios usuarios pueden pasar por lo mismo, y al restalecer se puede
restablecer incorrectamente.

Saludos
Carpe diem, tempus fugit.
El hombre sabio no da las respuestas correctas, propone las preguntas
correctas (Claude Levi-Strauss).
La sabiduría no es un producto de la educación sino de toda una vida por
adquirirla (Albert Einstein).
El sabio puede sentarse en un hormiguero, pero sólo el necio se queda
sentado en él (Proverbio chino).

AUS Federico A. Colli


"maxiperez" escribió en el mensaje
news:
Hola!
tengo una tabla con la clave primaria autonumerica. si intento hacer un
insert y este falla, el proximo insert correcto me guarda el registro con
un
salto numerico.
Por ejemplo:

registros existentes:
1-pepe
2-juan
3-lola

'insert falla y hago rollback
'otro insert falla y otro hago rollback
'proximo inser es correcto, y la clave es

6-manuel

¿porque no se guardo la clave con el valor 4 ?
¿hay alguna manera de que el SQL server no haga este salto autonumerico?

Respuesta Responder a este mensaje
#2 Alejandro Mesa
15/06/2007 - 16:11 | Informe spam
maxiperez,

En ese caso tendras que crear tu manera de asignar esos valores. Puedes
crear una tabla en la cual almacenes el nombre de la tabla y ultimo valor
asignado, luego mediante un procedimiento almacenado, pasas como parametro el
nombre de la tabla que deseas y devolveras el proximo valor.


Ejemplo:

create table dbo.t1 (
sk int not null identity,
tabla_schema sysname not null,
tabla_nombre sysname not null,
valor int not null default(0),
constraint pk_t1 primary key clustered (sk),
constraint uq_t1_tabla_schema_tabla_nombre unique (tabla_schema, tabla_nombre)
)
go

create table dbo.t2 (
c1 int not null primary key
)
go

insert into dbo.t1(tabla_schema, tabla_nombre) values(N'dbo', N't2')
go

create procedure dbo.usp_traer_proximo_valor
@tabla_schema sysname,
@tabla_nombre sysname,
@valor int output
as
set nocount on

update dbo.t1
set @valor = valor = valor + 1
where tabla_schema = @tabla_schema and tabla_nombre = @tabla_nombre

return @@error
go

create procedure dbo.usp_insertar_t2
as
set nocount on

declare @valor int
declare @rv int
declare @error int

begin transaction

exec @rv = dbo.usp_traer_proximo_valor N'dbo', N't2', @valor output

set @error = coalesce(nullif(@rv, 0), @@error)

if @error = 0
begin
insert into dbo.t2(c1) values(@valor)
commit transaction
end
else
begin
rollback transaction
return -1
end

return 0
go

exec dbo.usp_insertar_t2
exec dbo.usp_insertar_t2
go

begin transaction
exec dbo.usp_insertar_t2
rollback transaction
go

exec dbo.usp_insertar_t2
go

select * from dbo.t2
go

drop procedure dbo.usp_insertar_t2, dbo.usp_traer_proximo_valor
drop table dbo.t1, dbo.t2
go


AMB

"maxiperez" wrote:

Hola!
tengo una tabla con la clave primaria autonumerica. si intento hacer un
insert y este falla, el proximo insert correcto me guarda el registro con un
salto numerico.
Por ejemplo:

registros existentes:
1-pepe
2-juan
3-lola

'insert falla y hago rollback
'otro insert falla y otro hago rollback
'proximo inser es correcto, y la clave es

6-manuel

¿porque no se guardo la clave con el valor 4 ?
¿hay alguna manera de que el SQL server no haga este salto autonumerico?
Respuesta Responder a este mensaje
#3 Alejandro Mesa
15/06/2007 - 16:16 | Informe spam
Se me paso decir que una limitacion que se tiene al usar este metodo es que
no podras usar inserciones en masas sobre esa tabla, tales como BCP, BULK
INSERT, etc., ya que tendras que procesar fila por fila para poder llamar al
procedimiento almacenado para traer el valor correspondiente.


AMB

"Alejandro Mesa" wrote:

maxiperez,

En ese caso tendras que crear tu manera de asignar esos valores. Puedes
crear una tabla en la cual almacenes el nombre de la tabla y ultimo valor
asignado, luego mediante un procedimiento almacenado, pasas como parametro el
nombre de la tabla que deseas y devolveras el proximo valor.


Ejemplo:

create table dbo.t1 (
sk int not null identity,
tabla_schema sysname not null,
tabla_nombre sysname not null,
valor int not null default(0),
constraint pk_t1 primary key clustered (sk),
constraint uq_t1_tabla_schema_tabla_nombre unique (tabla_schema, tabla_nombre)
)
go

create table dbo.t2 (
c1 int not null primary key
)
go

insert into dbo.t1(tabla_schema, tabla_nombre) values(N'dbo', N't2')
go

create procedure dbo.usp_traer_proximo_valor
@tabla_schema sysname,
@tabla_nombre sysname,
@valor int output
as
set nocount on

update dbo.t1
set @valor = valor = valor + 1
where tabla_schema = @tabla_schema and tabla_nombre = @tabla_nombre

return @@error
go

create procedure dbo.usp_insertar_t2
as
set nocount on

declare @valor int
declare @rv int
declare @error int

begin transaction

exec @rv = dbo.usp_traer_proximo_valor N'dbo', N't2', @valor output

set @error = coalesce(nullif(@rv, 0), @@error)

if @error = 0
begin
insert into dbo.t2(c1) values(@valor)
commit transaction
end
else
begin
rollback transaction
return -1
end

return 0
go

exec dbo.usp_insertar_t2
exec dbo.usp_insertar_t2
go

begin transaction
exec dbo.usp_insertar_t2
rollback transaction
go

exec dbo.usp_insertar_t2
go

select * from dbo.t2
go

drop procedure dbo.usp_insertar_t2, dbo.usp_traer_proximo_valor
drop table dbo.t1, dbo.t2
go


AMB

"maxiperez" wrote:

> Hola!
> tengo una tabla con la clave primaria autonumerica. si intento hacer un
> insert y este falla, el proximo insert correcto me guarda el registro con un
> salto numerico.
> Por ejemplo:
>
> registros existentes:
> 1-pepe
> 2-juan
> 3-lola
>
> 'insert falla y hago rollback
> 'otro insert falla y otro hago rollback
> 'proximo inser es correcto, y la clave es
>
> 6-manuel
>
> ¿porque no se guardo la clave con el valor 4 ?
> ¿hay alguna manera de que el SQL server no haga este salto autonumerico?
Respuesta Responder a este mensaje
#4 maxiperez
15/06/2007 - 16:26 | Informe spam
"Federico A Colli" wrote:

No, pero podes restablecer la clave, nor ecuerdo la función requerida así
que alguien con mayores conocimientos lo dirá.

De todas formas, no te recomiendo ahcer esto, dado que en el uso concurrente
varios usuarios pueden pasar por lo mismo, y al restalecer se puede
restablecer incorrectamente.

Saludos
Carpe diem, tempus fugit.
El hombre sabio no da las respuestas correctas, propone las preguntas
correctas (Claude Levi-Strauss).
La sabiduría no es un producto de la educación sino de toda una vida por
adquirirla (Albert Einstein).
El sabio puede sentarse en un hormiguero, pero sólo el necio se queda
sentado en él (Proverbio chino).

AUS Federico A. Colli


"maxiperez" escribió en el mensaje
news:
> Hola!
> tengo una tabla con la clave primaria autonumerica. si intento hacer un
> insert y este falla, el proximo insert correcto me guarda el registro con
> un
> salto numerico.
> Por ejemplo:
>
> registros existentes:
> 1-pepe
> 2-juan
> 3-lola
>
> 'insert falla y hago rollback
> 'otro insert falla y otro hago rollback
> 'proximo inser es correcto, y la clave es
>
> 6-manuel
>
> ¿porque no se guardo la clave con el valor 4 ?
> ¿hay alguna manera de que el SQL server no haga este salto autonumerico?
>



Respuesta Responder a este mensaje
#5 maxiperez
15/06/2007 - 16:59 | Informe spam
ok, gracias. parece que SQL server no te lo hace automaticamente por lo que
he leido en los otros post.

Gracias a todos! por las prontas respuestas. Voy a meter mano
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida