Procedimiento almacenado

29/06/2006 - 15:59 por Hugo Gsell | Informe spam
Hola
Tengo una tabla que tiene un campo "identificador" idPaso que es clave...
pero no autonumerico
es decir, lo manejo yo. Como hay mas de 100 usuarios que pueden estar
"cargando datos" en esta tabla, necesito "de forma exclusiva" antes de
grabar recuperar el último código y sumarle uno.
Mi procedimiento almacenado actualmente está así y funciona (VER CODIGO
ABAJO)
La preguntas es ... como haría (en código transac) para:
1) que esta busqueda e inserción se ejecute como una transacción
2) qué debería agregar para hacer la búsqueda del último ID existente,
sumarle 1 y luego grabar este valor.
NOTA: NOTESE QUE SI BIEN EL IDPASO viene como parámetro no se lo va a usar
para grabarlo... esto es porque se pretende en 'alguna version posterior'
del procedimiento almacenado que si estos nros son distintos se devuelva
algun tipo de mensaje o el nro grabado...
Desde ya MUCHAS GRACIAS.

Hugo A. Gsell
Sgo del Estero
Argentina

codigo del procedimiento almacenado

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[GrabaPasos]
@pIdPaso smallint,
@pDescripcion as varchar(50)
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO Pasos (IdPaso,Descripcion) VALUES(@pIdPaso,@pDescripcion)
END
 

Leer las respuestas

#1 Alejandro Mesa
29/06/2006 - 16:43 | Informe spam
Hugo,

Una forma simple y probada de hacer esto es usando una segunda tabla para
guardar el ultimo valor asignado. En caso de tener multiples tablas donde
quieres usar este metodo, entonces agregas el nombre de la tabla como clave
primaria y pasa su nombre como parametro al procedimineto que se encarga de
actualizar la columna donde se guarda el ultimo valor.

Ejemplo:

use northwind
go

create table dbo.t1 (
c1 int not null
)
go

insert into dbo.t1 values(0)
go

create table dbo.t2 (
IdPaso int not null primary key clustered,
Descripcion varchar(50) not null unique
)
go

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

update dbo.t1
set @i = c1 = c1 + 1

return @@error
go

create procedure dbo.p2
@pIdPaso int,
@pDescripcion as varchar(50)
AS
SET NOCOUNT ON;

declare @i int
declare @rv int
declare @error int

begin transaction

exec @rv = dbo.p1 @i output

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

if @error != 0 or @i is null begin rollback transaction return -1 end

INSERT INTO dbo.t2 (IdPaso,Descripcion) VALUES(@i,@pDescripcion)

set @error = @@error

if @error != 0 begin rollback transaction return -1 end

commit transaction

return 0
go

exec dbo.p2 1, 'uno'
exec dbo.p2 1, 'dos'
exec dbo.p2 1, 'tres'
go

select * from dbo.t2
order by IdPaso
go

drop procedure dbo.p2, dbo.p1
go

drop table dbo.t1, dbo.t2
go


AMB


"Hugo Gsell" wrote:

Hola
Tengo una tabla que tiene un campo "identificador" idPaso que es clave...
pero no autonumerico
es decir, lo manejo yo. Como hay mas de 100 usuarios que pueden estar
"cargando datos" en esta tabla, necesito "de forma exclusiva" antes de
grabar recuperar el último código y sumarle uno.
Mi procedimiento almacenado actualmente está así y funciona (VER CODIGO
ABAJO)
La preguntas es ... como haría (en código transac) para:
1) que esta busqueda e inserción se ejecute como una transacción
2) qué debería agregar para hacer la búsqueda del último ID existente,
sumarle 1 y luego grabar este valor.
NOTA: NOTESE QUE SI BIEN EL IDPASO viene como parámetro no se lo va a usar
para grabarlo... esto es porque se pretende en 'alguna version posterior'
del procedimiento almacenado que si estos nros son distintos se devuelva
algun tipo de mensaje o el nro grabado...
Desde ya MUCHAS GRACIAS.

Hugo A. Gsell
Sgo del Estero
Argentina

codigo del procedimiento almacenado

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[GrabaPasos]
@pIdPaso smallint,
@pDescripcion as varchar(50)
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO Pasos (IdPaso,Descripcion) VALUES(@pIdPaso,@pDescripcion)
END





Preguntas similares