miércoles, 13 de abril de 2011

Captura de errores en SQL

Les dejo un ejemplo de como capturar el error al insertar un registro en una tabla, esto se puede facilmente integrar en un trigger, así de esta forma se puede reaccionar al error y centralizar el comportamiento (registrando errores en un log, por ejemplo, o unicamente retornando un error personalizado)

CREATE TABLE #prueba(
      [Campo1] [char](4) not NULL,
      [Campo2] [varchar](200) NULL
CONSTRAINT [PK_prueba] PRIMARY KEY CLUSTERED
(
      [Campo1] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

declare @Id as char(4)
BEGIN TRY
      set @Id = '0001'
      INSERT INTO #prueba
            (Campo1, campo2 )
     VALUES
            (@Id, 'Valor 1');
    SELECT
        -1 AS ErrorNumber,
        -1 AS ErrorSeverity,
        -1 AS ErrorState,
            -1 AS ErrorProcedure,
        -1 AS ErrorLine,
        'Registro ' + @Id + ' ingresado correctamente' AS ErrorMessage;

--  comentarizar el siguiente este bloque de código para ver como se comporta sin la captura del error
-----------------------------------------
      INSERT INTO #prueba
            (Campo1, campo2 )
     VALUES
            (@Id, 'Valor 1');
    SELECT
        -1 AS ErrorNumber,
        -1 AS ErrorSeverity,
        -1 AS ErrorState,
            -1 AS ErrorProcedure,
        -1 AS ErrorLine,
        'Registro ' + @Id + ' ingresado correctamente' AS ErrorMessage;
-----------------------------------------
--  Quitar el comentario de este bloque de código para ver como se comporta sin la captura del error
--    INSERT INTO #prueba
--          ( campo2 )
--     VALUES
--          ( 'Valor 2');
--    SELECT
--        -1 AS ErrorNumber,
--        -1 AS ErrorSeverity,
--        -1 AS ErrorState,
--          -1 AS ErrorProcedure,
--        -1 AS ErrorLine,
--        'Registro ' + @Id + ' ingresado correctamente' AS ErrorMessage;
-----------------------------------------
END TRY
BEGIN CATCH
      declare @Id_Error as int
      select @Id_Error = ERROR_NUMBER()
      if @Id_Error = 2627
      Begin
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        'El registro ' + @Id + ' está duplicado' AS ErrorMessage;
      End
      Else
      Begin
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
      END  
END CATCH;
select * from #Prueba
drop table #prueba


Espero les sea útil.

No hay comentarios:

Búsqueda