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

#6 Hugo Gsell
29/06/2006 - 17:28 | Informe spam
si algo así mira... mi ejemplo

ALTER PROCEDURE [dbo].[GrabaPasos]
@pIdPaso smallint,
@pDescripcion as varchar(50)
AS
DECLARE @C smallint
BEGIN
SET NOCOUNT ON;
SET @C = Select IsNull(Max(IdPaso),0) + 1 From Pasos
INSERT INTO Pasos (IdPaso,Descripcion) VALUES(@C,@pDescripcion)
END

donde esta el "SET @C = Select IsNull(Max(IdPaso),0) + 1 From Pasos"
pero al querer ejecutar la modificación del procedimiento me da:

Msg 156, Level 15, State 1, Procedure GrabaPasos, Line 14
Sintaxis incorrecta cerca de la palabra clave 'Select'.


HUGO


"Ele" escribió en el mensaje
news:Ongv$
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
#7 Alejandro Mesa
29/06/2006 - 17:31 | Informe spam
Hugo,

create table dbo.t1 (
IdPaso int,
description varchar(50)
)
go

create procedure dbo.p1
@idpaso int,
@description varchar(50)
as
set nocount on

declare @error int

set transaction isolation level SERIALIZABLE

begin transaction

insert into dbo.t1
select isnull(max(IdPaso), 0) + 1, @description
from dbo.t1

set @error = @@error

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

commit transaction

return @@error
go

exec dbo.p1 1, 'uno'
exec dbo.p1 2, 'dos'
go

select * from dbo.t1
go

drop procedure dbo.p1
go

drop table dbo.t1
go



AMB

"Hugo Gsell" wrote:

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
#8 Hugo Gsell
29/06/2006 - 17:45 | Informe spam
GRACIAS ESO ERA LO QUE NECESITABA.
Hugo A. Gsell
Sgo del Estero
Argentina

"Alejandro Mesa" escribió en el
mensaje news:
Hugo,

create table dbo.t1 (
IdPaso int,
description varchar(50)
)
go

create procedure dbo.p1
@idpaso int,
@description varchar(50)
as
set nocount on

declare @error int

set transaction isolation level SERIALIZABLE

begin transaction

insert into dbo.t1
select isnull(max(IdPaso), 0) + 1, @description
from dbo.t1

set @error = @@error

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

commit transaction

return @@error
go

exec dbo.p1 1, 'uno'
exec dbo.p1 2, 'dos'
go

select * from dbo.t1
go

drop procedure dbo.p1
go

drop table dbo.t1
go



AMB

"Hugo Gsell" wrote:

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
#9 Carlos Gómez
29/06/2006 - 17:51 | Informe spam
PROCEDURE [dbo].[GrabaPasos]
@pIdPaso smallint OUTPUT, --y asi conseguieras el id asignado
@pDescripcion as varchar(50)
AS
BEGIN


BEGIN TRAN
SELECT @pIdPaso = MAX(IdPaso) FROM Pasos


SET @pIdPaso = @pIdPaso + 1
INSERT INTO Pasos (IdPaso,Descripcion) VALUES(@pIdPaso,@pDescripcion)


COMMIT TRAN
END



Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#10 Ele
29/06/2006 - 18:43 | Informe spam
ya te respondieron los demas compañeros ese error es porque no va 'Set'
checa bien hay un select y una asignacion en una misma sentencia

"Hugo Gsell" escribió en el mensaje
news:
si algo así mira... mi ejemplo

ALTER PROCEDURE [dbo].[GrabaPasos]
@pIdPaso smallint,
@pDescripcion as varchar(50)
AS
DECLARE @C smallint
BEGIN
SET NOCOUNT ON;
SET @C = Select IsNull(Max(IdPaso),0) + 1 From Pasos
INSERT INTO Pasos (IdPaso,Descripcion) VALUES(@C,@pDescripcion)
END

donde esta el "SET @C = Select IsNull(Max(IdPaso),0) + 1 From Pasos"
pero al querer ejecutar la modificación del procedimiento me da:

Msg 156, Level 15, State 1, Procedure GrabaPasos, Line 14
Sintaxis incorrecta cerca de la palabra clave 'Select'.


HUGO


"Ele" escribió en el mensaje
news:Ongv$
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 AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida