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
 

Leer las respuestas

#1 Alejandro Mesa
09/09/2006 - 15:23 | Informe spam
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


Preguntas similares