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

#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


Respuesta Responder a este mensaje
#2 Pedro Echavarria
09/09/2006 - 17:14 | Informe spam
Pregunta:
Si un SP2 genera un error, no se supone que luego de su llamada podemos
preguntar por @@ERROR igual que si fuera cualquier otra instruccion ?

el.

EXEC SP2
if @@ERROR<>0


"Alejandro Mesa" wrote in message
news:
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
#3 Maxi
09/09/2006 - 17:34 | Informe spam
Hola, con el permiso de ALe, si eso lo podes hacer pero el SP2 debe retornar
el error, lo que deberias hacer en este caso es si sp2 detecto un problema
que haga un return distinto de 0






Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker
www.sqlgururs.org
Email:


"Pedro Echavarria" wrote in message
news:
Pregunta:
Si un SP2 genera un error, no se supone que luego de su llamada podemos
preguntar por @@ERROR igual que si fuera cualquier otra instruccion ?

el.

EXEC SP2
if @@ERROR<>0


"Alejandro Mesa" wrote in
message news:
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
#4 DNC
09/09/2006 - 20:23 | Informe spam
Hola Maxi,

verifica tu firma pues dice www.sqlgururs.org donde deberia ser
http://www.sqlgurus.org

:-D

Saludos!

Maxi ha escrito:

Hola, con el permiso de ALe, si eso lo podes hacer pero el SP2 debe retornar
el error, lo que deberias hacer en este caso es si sp2 detecto un problema
que haga un return distinto de 0






Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker
www.sqlgururs.org
Email:
Respuesta Responder a este mensaje
#5 Alejandro Mesa
09/09/2006 - 21:06 | Informe spam
Hola Pedro,

Reconozco que SQL Server 2000 no es muy amigable a la hora de manejar errores.

Hay errores que abortan la sentencia pero no el batch, por lo que si el
error ocurre con alguna sentencia dentro de sp2, la siguiente sentencia se
ejecutara y el error se perdera. Por eso es importante capturar esos errore
en cada sp y retornar un valor que indique si hubo algun error o no.

Fijate en la sentencia que aparece en el ejemplo que puse.

...
exec @rv = dbo.sp2

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

if @error != 0 ...

Se captura el valor de retorno de sp2, en caso de que este sea 0, se
pregunta por @@error, pero en caso de que esta sea distinto de 0 entonces se
considera que hubo un error y que este fue capturado dentro de sp2. Existe la
posibilidad de que el error aborte sp2, por lo que se pregunta tambien por
@@error.

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


AMB

"Pedro Echavarria" wrote:

Pregunta:
Si un SP2 genera un error, no se supone que luego de su llamada podemos
preguntar por @@ERROR igual que si fuera cualquier otra instruccion ?

el.

EXEC SP2
if @@ERROR<>0


"Alejandro Mesa" wrote in message
news:
> 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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida