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

Preguntas similare

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





Respuesta Responder a este mensaje
#2 Ele
29/06/2006 - 16:47 | Informe spam
Hola yo propongo que guardes en una tabla la ultima clave
cuando quieras grabar primero incrementas la clave la guardas y ese valor lo
regresas para que sea usado en el insert..

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




Respuesta Responder a este mensaje
#3 Hugo Gsell
29/06/2006 - 16:56 | Informe spam
haber.. explico un poco mas... por un lado son las primeras pruebas que
estoy haciendo... con el tema de proc. almacenados y sql...
es decir, todo esto es para practicar un poco y además lo necesito.
por otro lado no me sirve usar una tabla auxiliar para mantener el nro
siguiente... porque no es como un nro de comprobante de una factura por ej.
en ese caso si lo usaría... inclusive el rendimiento sería superiro... ya
que no debería "calcular el últmo nro".
Es una table base... que en realidad no será accedida concurrentemente, pero
se decidio manejar por código este 'codigo', porque otra opción sería
utilizar un autonumérico
Es decir, puntualmente necesito desde código transac como acceder a esta
misma tabla y recuperar (supongo que usando alguna funcion tipo max o algo
asi) el valor maximo el resto mas o menos lo entendí.
Muchas gracias.


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





Respuesta Responder a este mensaje
#4 Hugo Gsell
29/06/2006 - 16:56 | Informe spam
haber.. explico un poco mas... por un lado son las primeras pruebas que
estoy haciendo... con el tema de proc. almacenados y sql...
es decir, todo esto es para practicar un poco y además lo necesito.
por otro lado no me sirve usar una tabla auxiliar para mantener el nro
siguiente... porque no es como un nro de comprobante de una factura por ej.
en ese caso si lo usaría... inclusive el rendimiento sería superiro... ya
que no debería "calcular el últmo nro".
Es una table base... que en realidad no será accedida concurrentemente, pero
se decidio manejar por código este 'codigo', porque otra opción sería
utilizar un autonumérico
Es decir, puntualmente necesito desde código transac como acceder a esta
misma tabla y recuperar (supongo que usando alguna funcion tipo max o algo
asi) el valor maximo el resto mas o menos lo entendí.
Muchas gracias.
HUGO

"Ele" escribió en el mensaje
news:%
Hola yo propongo que guardes en una tabla la ultima clave
cuando quieras grabar primero incrementas la clave la guardas y ese valor
lo regresas para que sea usado en el insert..

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








Respuesta Responder a este mensaje
#5 Ele
29/06/2006 - 17:23 | Informe spam
mm no entiendo muy bien, buscas algo asi Select IsNull(Max(IdPaso),0) + 1
From Pasos.. esta es la ultima clave (mayor)

"Hugo Gsell" escribió en el mensaje
news:
haber.. explico un poco mas... por un lado son las primeras pruebas que
estoy haciendo... con el tema de proc. almacenados y sql...
es decir, todo esto es para practicar un poco y además lo necesito.
por otro lado no me sirve usar una tabla auxiliar para mantener el nro
siguiente... porque no es como un nro de comprobante de una factura por
ej. en ese caso si lo usaría... inclusive el rendimiento sería superiro...
ya que no debería "calcular el últmo nro".
Es una table base... que en realidad no será accedida concurrentemente,
pero se decidio manejar por código este 'codigo', porque otra opción sería
utilizar un autonumérico
Es decir, puntualmente necesito desde código transac como acceder a esta
misma tabla y recuperar (supongo que usando alguna funcion tipo max o algo
asi) el valor maximo el resto mas o menos lo entendí.
Muchas gracias.
HUGO

"Ele" escribió en el mensaje
news:%
Hola yo propongo que guardes en una tabla la ultima clave
cuando quieras grabar primero incrementas la clave la guardas y ese valor
lo regresas para que sea usado en el insert..

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












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