Procedimientos almacenados y transacciones

09/09/2006 - 02:23 por Merced | Informe spam
Hola, ¿que tal? les comento mi problema:

Estoy desarrollando una aplicación de escritorio en VB6 y SQL Server
2000.

Tengo 2 procedimientos almacenados. Desde el SP_Uno inicio una
transacción, hago un INSERT y controlo si la operación fue exitosa o
no. Hasta aquí todo claro.
Luego realizo un SELECT, primera duda, ¿es necesario controlar si esta
ultima fue exitosa o no para tomar medidas?

Luego llamo a SP_Dos, el cual realiza un simple UPDATE. Inmediatamente
después controlo si la ejecución de este SP_Dos fue correcta. Aquí
mi otra duda. Si el SP_Dos falla, ¿@@Error contendrá el valor del
error? ¿SP_Dos debe retornar un valor a SP_Uno que indique cual fue el
error que se produzco?

Agradezco sus comentarios.
Ezequiel.

-

SP_Dos
UPDATE


SP_Uno
BEGIN TRAN
INSERT ...

IF @@ERROR <> 0
BEGIN
RAISERROR 'Error' ...
ROLLBACK TRAN
END

SELECT * ...

EXEC SP_Dos

IF @@ERROR <> 0
BEGIN
RAISERROR 'Error' ...
ROLLBACK TRAN
END
COMMIT TRAN

Preguntas similare

Leer las respuestas

#6 Merced
12/09/2006 - 00:35 | Informe spam
Muchas gracias Alejandro. Voy a probar tu solucion.

En cuanto a lo que me preguntas, el SELECT devuelve un valor que luego
se lo paso como parametro a SP_Dos. Mi pregunta concreta era si luego
de realizar el SELECT tengo que comprobar @@Error.

Alejandro Mesa ha escrito:

Merced,

El sp 2 debe controlar tambien los errores y ademas devolver un valor de
retorno indicando si la operacion fue satisfactoria o no y sp 1 tomara
medidas depende de este valor y logicamente del valor de @@error. Pudieras
explicar por que la sentencia "Select"debe estar dentro de la transaccion?.

declare @rv int
declare @error int

begin transaction

insert ...

set @error = @@error

if @error != 0 goto ErrorHandler

exec @rv = dbo.sp2 ...

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

if @error != 0 goto ErrorHandler

commit transaction

select ...

return 0

ErrorHandler:

if @@transcount > 0
rollback transaction

return -1
go

Aca te adjunto los links a dos magnificos articulos sobre el manejo de
errores en SQL Server 2000.

Error Handling in SQL Server - a Background
http://www.sommarskog.se/error-handling-I.html

Implementing Error Handling with Stored Procedures
http://www.sommarskog.se/error-handling-II.html


AMB

"Merced" wrote:

> Hola, ¿que tal? les comento mi problema:
>
> Estoy desarrollando una aplicación de escritorio en VB6 y SQL Server
> 2000.
>
> Tengo 2 procedimientos almacenados. Desde el SP_Uno inicio una
> transacción, hago un INSERT y controlo si la operación fue exitosa o
> no. Hasta aquí todo claro.
> Luego realizo un SELECT, primera duda, ¿es necesario controlar si esta
> ultima fue exitosa o no para tomar medidas?
>
> Luego llamo a SP_Dos, el cual realiza un simple UPDATE. Inmediatamente
> después controlo si la ejecución de este SP_Dos fue correcta. Aquí
> mi otra duda. Si el SP_Dos falla, ¿@@Error contendrá el valor del
> error? ¿SP_Dos debe retornar un valor a SP_Uno que indique cual fue el
> error que se produzco?
>
> Agradezco sus comentarios.
> Ezequiel.
>
> -
>
> SP_Dos
> UPDATE
>
>
> SP_Uno
> BEGIN TRAN
> INSERT ...
>
> IF @@ERROR <> 0
> BEGIN
> RAISERROR 'Error' ...
> ROLLBACK TRAN
> END
>
> SELECT * ...
>
> EXEC SP_Dos
>
> IF @@ERROR <> 0
> BEGIN
> RAISERROR 'Error' ...
> ROLLBACK TRAN
> END
> COMMIT TRAN
>
>
Respuesta Responder a este mensaje
#7 Alejandro Mesa
12/09/2006 - 01:45 | Informe spam
Merced,

Mi pregunta concreta era si luego de realizar el
SELECT tengo que comprobar @@Error.



Principalmente se debe chequear despues de sentencias DML, ejecucion de sps,
etc., pero si lo haces despues de la sentencia "select" no hara ningun daño.


AMB


"Merced" wrote:

Muchas gracias Alejandro. Voy a probar tu solucion.

En cuanto a lo que me preguntas, el SELECT devuelve un valor que luego
se lo paso como parametro a SP_Dos. Mi pregunta concreta era si luego
de realizar el SELECT tengo que comprobar @@Error.

Alejandro Mesa ha escrito:

> Merced,
>
> El sp 2 debe controlar tambien los errores y ademas devolver un valor de
> retorno indicando si la operacion fue satisfactoria o no y sp 1 tomara
> medidas depende de este valor y logicamente del valor de @@error. Pudieras
> explicar por que la sentencia "Select"debe estar dentro de la transaccion?.
>
> declare @rv int
> declare @error int
>
> begin transaction
>
> insert ...
>
> set @error = @@error
>
> if @error != 0 goto ErrorHandler
>
> exec @rv = dbo.sp2 ...
>
> set @error = coalesce(nullif(@rv, 0), @@error)
>
> if @error != 0 goto ErrorHandler
>
> commit transaction
>
> select ...
>
> return 0
>
> ErrorHandler:
>
> if @@transcount > 0
> rollback transaction
>
> return -1
> go
>
> Aca te adjunto los links a dos magnificos articulos sobre el manejo de
> errores en SQL Server 2000.
>
> Error Handling in SQL Server - a Background
> http://www.sommarskog.se/error-handling-I.html
>
> Implementing Error Handling with Stored Procedures
> http://www.sommarskog.se/error-handling-II.html
>
>
> AMB
>
> "Merced" wrote:
>
> > Hola, ¿que tal? les comento mi problema:
> >
> > Estoy desarrollando una aplicación de escritorio en VB6 y SQL Server
> > 2000.
> >
> > Tengo 2 procedimientos almacenados. Desde el SP_Uno inicio una
> > transacción, hago un INSERT y controlo si la operación fue exitosa o
> > no. Hasta aquí todo claro.
> > Luego realizo un SELECT, primera duda, ¿es necesario controlar si esta
> > ultima fue exitosa o no para tomar medidas?
> >
> > Luego llamo a SP_Dos, el cual realiza un simple UPDATE. Inmediatamente
> > después controlo si la ejecución de este SP_Dos fue correcta. Aquí
> > mi otra duda. Si el SP_Dos falla, ¿@@Error contendrá el valor del
> > error? ¿SP_Dos debe retornar un valor a SP_Uno que indique cual fue el
> > error que se produzco?
> >
> > Agradezco sus comentarios.
> > Ezequiel.
> >
> > -
> >
> > SP_Dos
> > UPDATE
> >
> >
> > SP_Uno
> > BEGIN TRAN
> > INSERT ...
> >
> > IF @@ERROR <> 0
> > BEGIN
> > RAISERROR 'Error' ...
> > ROLLBACK TRAN
> > END
> >
> > SELECT * ...
> >
> > EXEC SP_Dos
> >
> > IF @@ERROR <> 0
> > BEGIN
> > RAISERROR 'Error' ...
> > ROLLBACK TRAN
> > END
> > COMMIT TRAN
> >
> >


Respuesta Responder a este mensaje
#8 Alfredo Crisostomo
12/09/2006 - 15:39 | Informe spam

En caso de que el error haga que se aborte ambos procediminetos, entonces
la
aplicacion cliente debe capturar el error.




El error que ocurre en SP2 (me refiero a un error real de alguna sentencia
que afecto @@ERROR) no es reportado de todos modos a la aplicacion cliente
aunque no se haya reportado al SP llamador ?
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida