Retornar el número de error de un stored procedure en SQL Server

Iniciado por DanteInfernum, 1 Octubre 2013, 21:15 PM

0 Miembros y 1 Visitante están viendo este tema.

DanteInfernum

Quiero crear un procedimiento que en caso de error me retorne el número del error.
Tengo el siguiente código:

Código (sql) [Seleccionar]
CREATE PROCEDURE proc4
@idSeccion nchar(3),
@descripcion varchar(20)
AS
BEGIN
INSERT INTO Secciones
VALUES(@idSeccion, @descripcion)
IF @@ERROR <> 0
BEGIN
RETURN @@ERROR
END
ELSE
BEGIN
RETURN 1
END
END


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?

Shell Root

Código (sql) [Seleccionar]
BEGIN TRY
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER() AS 'ERROR_NUMBER()', @@ERROR AS '@@ERROR';
END CATCH;


Resultado:
Código (sql) [Seleccionar]
ERROR_NUMBER()   @@ERROR
8134          8134
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

DanteInfernum

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.

DanteInfernum

¡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 (sql) [Seleccionar]

ALTER PROCEDURE proc4
@idSeccion nchar(3),
@descripcion varchar(20)
AS
BEGIN
DECLARE @error int
INSERT INTO Secciones
VALUES(@idSeccion, @descripcion)
SET @error = @@ERROR
IF @error <> 0
BEGIN
RETURN @error
END
ELSE
BEGIN
RETURN 1
END
END