Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: DanteInfernum en 1 Octubre 2013, 21:15 pm



Título: Retornar el número de error de un stored procedure en SQL Server
Publicado por: DanteInfernum en 1 Octubre 2013, 21:15 pm
Quiero crear un procedimiento que en caso de error me retorne el número del error.
Tengo el siguiente código:

Código
  1. CREATE PROCEDURE proc4
  2. @idSeccion NCHAR(3),
  3. @descripcion VARCHAR(20)
  4. AS
  5. BEGIN
  6. INSERT INTO Secciones
  7. VALUES(@idSeccion, @descripcion)
  8. IF @@ERROR <> 0
  9. BEGIN
  10. RETURN @@ERROR
  11. END
  12. ELSE
  13. BEGIN
  14. RETURN 1
  15. END
  16. END
  17.  

Pero, a pesar de producirse el error, siempre me devuelve 0.
¿Cuál sería la forma correcta de conseguir esto? ¿Qué estoy haciendo mal?


Título: Re: Retornar el número de error de un stored procedure en SQL Server
Publicado por: Shell Root en 1 Octubre 2013, 21:32 pm
Código
  1. BEGIN TRY
  2.    SELECT 1/0;
  3. END TRY
  4. BEGIN CATCH
  5.    SELECT ERROR_NUMBER() AS 'ERROR_NUMBER()', @@ERROR AS '@@ERROR';
  6. END CATCH;

Resultado:
Código
  1. ERROR_NUMBER()   @@ERROR
  2. 8134         8134


Título: Re: Retornar el número de error de un stored procedure en SQL Server
Publicado por: DanteInfernum en 2 Octubre 2013, 15:43 pm
Sí, está bien. Tendría que haber aclarado que estoy usando SQL Server 2005. Por lo que he leído esta versión no admite los bloques TRY y CATCH.


Título: Re: Retornar el número de error de un stored procedure en SQL Server
Publicado por: DanteInfernum en 2 Octubre 2013, 16:13 pm
¡Encontré la solución!

Resulta que la variable @@error cambia constantemente de valor. Específicamente, se modifica cada vez que se ejecuta una sentencia. En este caso, si bien se produce un error al insertar el registro, luego la sentencia IF se ejecuta sin problema alguno, de ahí que el valor de @@error se reinicializa a 0.
Lo que hay que hacer para evitar esto, es guardar el valor de @@error en una variable.

Código
  1. ALTER PROCEDURE proc4
  2. @idSeccion NCHAR(3),
  3. @descripcion VARCHAR(20)
  4. AS
  5. BEGIN
  6. DECLARE @error INT
  7. INSERT INTO Secciones
  8. VALUES(@idSeccion, @descripcion)
  9. SET @error = @@ERROR
  10. IF @error <> 0
  11. BEGIN
  12. RETURN @error
  13. END
  14. ELSE
  15. BEGIN
  16. RETURN 1
  17. END
  18. END
  19.