SQL Server - Problemas con RAISERROR

 
Vista:

Problemas con RAISERROR

Publicado por achafio (37 intervenciones) el 08/01/2009 23:12:59
Tengo el siguiente inconveniente.

Tengo un store procedure tanto en sql server 2000 como en sql server 2005 (es el mismo script para ambos), en la cual por decir en medio del script tengo un update despues de eso hago validaciones de otras tablas si en caso hubo problemas hago un RAISERROR y no se ejecuta las demas lineas y logicamente eso deberia generar un ROLLBACK es decir cancelar el update que se generó anteriormente.

En sql server 2000 funciona a la perfección, pero en sql server 2005 no cancela el update que se generó anteriormente, pero si en el sql server 2005 activo el campo implicit transactions ahi si funciona, mi duda es porque ocurre esto, ya que en sql 2000 no tengo porque activar el implicit transactions.

Gracias por la aclaración.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problemas con RAISERROR

Publicado por pacopaz (131 intervenciones) el 12/01/2009 22:19:24
Subir de versión no necesariamente significa hacer las cosas más fáciles, si no mejores.
Hasta antes de SQL Server 2005 me hacía falta un try...catch...end, como el implementado desde hace mucho por borland y que existió desde .Net para Visual Studio. Debido a que ahora ya existe, el manejo de errores ha mejorado considerablemente para SQL Server y es por esto que se te presenta este 'inconveniente'.
El manejo de transacciones ya sucedía para versiones anteriores y como has notado (certeramente) era transparente para el programador. Sin embargo, el forzar el manejo explícito de transacciones es, por mucho, más una mejora que un inconveniente, sobre todo, si combinas el manejo de transacciones con el manejo de errores.
Lo que te recomiendo es que utilices esto a tu favor y comiences a programar en bloques similares a esto:

create procedure [nombre]
(..., ..., ...,
@ERR_NO int = 0 output,
@ERR_MSG nvarchar(2048) = '' output) --*
as
begin
begin try
begin transaction
....
commit transaction
end try
begin catch
...
rollback transaction
select @ERR_NO = ERROR_NUMBER()
select @ERR_MSG = ERROR_MESSAGE()
end catch
end

--* Es de 2Kb, por que es el tamaño máximo de mensaje de error.

Esto, por mi experiencia, te permite controlar y ejercer acciones en tu aplicativo, si sucediera algún error, por que obtienes el número de error y su mensaje, sin necesidad de replicar desde el query analizer o alguna situación similar. Además, el manejo de transacciones permite ejecutar bloques de instrucciones, sin preocuparte por que pedazos de instrucciones hayan sucedido mientras que otras no. Esto sirve mucho, sobre todo en proceimientos largos que pueden llegar a generar problemas de respuesta entre servidores o por registros bloqueados y, con un poquito de ingenio, hasta para mantener un log de desempeño.

Para más información, dirígete a estas páginas:
http://msdn.microsoft.com/es-es/library/ms175976(SQL.90).aspx (try)
http://msdn.microsoft.com/es-es/library/ms175069(SQL.90).aspx (no. err)
http://msdn.microsoft.com/es-es/library/ms190358(SQL.90).aspx (msj err)
http://msdn.microsoft.com/es-es/library/ms181299(SQL.90).aspx (rollback)

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas con RAISERROR

Publicado por Moravi (1 intervención) el 09/02/2009 15:58:52
Cuando realizas el RAISERROR debes pasarle al errror una severidad mayor a 11, yo te sugiero 15; de esta forma el administrador de SQL Server realizará el ROLLBACK de la transacción.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar