下面是類似的東西我用的依據是:Error and Transaction Handling in SQL Server Part One (of Three) – Jumpstart Error Handling - Erland Sommarskog
表和程序設置:
create table dbo.error_handler_log (
id int identity(1,1) not null primary key
, error_date datetimeoffset(7) not null
, severity tinyint not null
, [state] tinyint not null
, [number] int not null
, line int not null
, [procedure] sysname null
, message nvarchar(2048)
);
go
create procedure [dbo].[error_handler_sp] as
begin
set nocount, xact_abort on;
declare
@error_date datetimeoffset(7) = sysdatetimeoffset()
, @severity tinyint = isnull(error_severity(),16)
, @state tinyint = isnull(error_state(),1)
, @number int = isnull(error_number(),0)
, @line int = isnull(error_line(),0)
, @procedure sysname = error_procedure()
, @message nvarchar(2048) = error_message();
insert into [dbo].[error_handler_log]
([error_date],[procedure],[severity],[state],[number],[line],[message]) values
(@error_date, @procedure, @severity, @state, @number, @line, @message);
--raiserror(@message, @severity, @state); /* don't re-raise error to continue code execution */
end;
go
rextester演示:http://rextester.com/EYLAFM93158
dbfiddle.uk demo
begin try;
select 1/0 as err;
end try
begin catch;
exec dbo.error_handler_sp;
end catch;
begin try;
select 1/0 as err;
end try
begin catch;
exec dbo.error_handler_sp;
end catch;
begin try;
select 1/1 as one;
end try
begin catch;
exec dbo.error_handler_sp;
end catch;
select *
from dbo.error_handler_log;
回報:
+-----+
| one |
+-----+
| 1 |
+-----+
+----+----------------------------+----------+-------+--------+------+-----------+-----------------------------------+
| id | error_date | severity | state | number | line | procedure | message |
+----+----------------------------+----------+-------+--------+------+-----------+-----------------------------------+
| 1 | 10/08/2017 13:26:00 +01:00 | 16 | 1 | 8134 | 2 | null | Divide by zero error encountered. |
| 2 | 10/08/2017 13:26:00 +01:00 | 16 | 1 | 8134 | 8 | null | Divide by zero error encountered. |
+----+----------------------------+----------+-------+--------+------+-----------+-----------------------------------+
您可以將每個更新語句包裝在try ... catch塊中。這是我在編程語言中使用循環而不是在sql server中手動執行的操作。 –
如何捕獲錯誤的記錄/審計表?我想嘗試一下,但我不確定如何去做。 –