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.
0 comentarios:
Publicar un comentario en la entrada