Control Errores y Transacciones

11/05/2005 - 17:33 por Asier | Informe spam
Hola grupo,

Tengo el siguiente proc almacenado:

CREATE PROCEDURE _spBorrar1
@id_Error int output
AS
begin tran

update tabla1 set nombre='a' where id=1
If @@Error<>0
Begin
Rollback tran
Print @id_Error
End

update tabla1 set numero™9999 where id=1
If @@Error<>0
Begin
Rollback tran
Return 1
End

Commit tran
GO

Está preparado para que falle la segunda update porque el campo numero es un
samllint. El problema que tengo, es que no sigue ejecutando el Rollback y el
Return y debería ¿no?. Saca un mensaje de error en la update y no prosigue.

¿Que hago mal?

Gracias y saludos,

Asier

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
11/05/2005 - 18:00 | Informe spam
Asier,

Como sabes que no pasa por ahi?

Puedes probar esto:

CREATE PROCEDURE _spBorrar1
@id_Error int output
AS
set nocount on

begin tran

update tabla1 set nombre='a' where id=1

If @@Error<>0
Begin
Rollback tran
raiserror('error updating tabla1, step 1.', 16, 1)
return 1
End

update tabla1 set numero™9999 where id=1
If @@Error<>0
Begin
Rollback tran
raiserror('error updating tabla1, step 2.', 16, 1)
Return 1
End

Commit tran

return 0
GO

declare @rv int
declare @error int

print @@trancount

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

print @rv
print @@trancount
go

Dejanos saber si puedes ver el mensaje de la funcion raiserror.


AMB



"Asier" wrote:

Hola grupo,

Tengo el siguiente proc almacenado:

CREATE PROCEDURE _spBorrar1
@id_Error int output
AS
begin tran

update tabla1 set nombre='a' where id=1
If @@Error<>0
Begin
Rollback tran
Print @id_Error
End

update tabla1 set numero™9999 where id=1
If @@Error<>0
Begin
Rollback tran
Return 1
End

Commit tran
GO

Está preparado para que falle la segunda update porque el campo numero es un
samllint. El problema que tengo, es que no sigue ejecutando el Rollback y el
Return y debería ¿no?. Saca un mensaje de error en la update y no prosigue.

¿Que hago mal?

Gracias y saludos,

Asier




Respuesta Responder a este mensaje
#2 qwalgrande
12/05/2005 - 00:51 | Informe spam
Hola,

En tu mismo código, ¿puedes ejecutar lo siguiente:

declare @er int, @ret int

exec @ret = _spBorrar1 @er output

select @er Er, @ret Ret

A pesar de los errores, debería devolverte 1 el valor de retorno. Y eso te
asegura que la transacción se ha llevado atrás.

SQL Server 2005 introduce una nueva característica para la captura de
errores. El mismo procedimiento, para SQL Server 2005, usando try/catch:
alter PROCEDURE _spBorrar1

@id_Error int output

AS

begin tran

update tabla1 set nombre='a' where id=1

If @@Error<>0

Begin

Rollback tran

Print @id_Error

End

begin try

update tabla1 set numero™9999 where id=1

end try

begin catch

select @id_Error = @@error

Rollback tran

Return 1

end catch

if @@trancount > 0

Commit tran

GO

declare @er int, @ret int

exec @ret = _spBorrar1 @er output

select @er Er, @ret Ret

GO


qwalgrande

"De lo que ves créete la mitad, de lo que no ves no te creas nada"
V. del V.


"Asier" <asier> escribió en el mensaje
news:
Hola grupo,

Tengo el siguiente proc almacenado:

CREATE PROCEDURE _spBorrar1
@id_Error int output
AS
begin tran

update tabla1 set nombre='a' where id=1
If @@Error<>0
Begin
Rollback tran
Print @id_Error
End

update tabla1 set numero™9999 where id=1
If @@Error<>0
Begin
Rollback tran
Return 1
End

Commit tran
GO

Está preparado para que falle la segunda update porque el campo numero es
un
samllint. El problema que tengo, es que no sigue ejecutando el Rollback y
el
Return y debería ¿no?. Saca un mensaje de error en la update y no
prosigue.

¿Que hago mal?

Gracias y saludos,

Asier



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida