sql server 保存错误信息到日志表

建表

CREATE TABLE ErrorLog(
    [ErrorLogID] [int] IDENTITY(1,1) NOT NULL,
    [ErrorTime] [datetime] NULL,
    [UserName] [sysname] NULL,
    [ErrorNumber] [int] NULL,
    [ErrorSeverity] [int] NULL,
    [ErrorState] [int] NULL,
    [ErrorProcedure] [nvarchar](126) NULL,
    [ErrorLine] [int] NULL,
    [ErrorMessage] [nvarchar](4000) NULL,
 CONSTRAINT [PK_ERRORLOG] PRIMARY KEY CLUSTERED 
(
    [ErrorLogID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[ErrorLog] ADD  DEFAULT (getdate()) FOR [ErrorTime]
GO

存储过程

create procedure pro_ErrorLog
AS                               
BEGIN
    SET NOCOUNT ON;

        INSERT INTO [dbo].[ErrorLog]
            (
            [UserName],
            [ErrorNumber],
            [ErrorSeverity],
            [ErrorState],
            [ErrorProcedure],
            [ErrorLine],
            [ErrorMessage]
            )
        VALUES
            (
            CONVERT(sysname, CURRENT_USER),--current_user ,这里值是dbo,dbo是每个数据库的默认用户,具有所有者权限
                                           --sysname类型 用于表列、变量以及用于存储对象名的存储过程参数,等价与nvachart(120)
            ERROR_NUMBER(),                 --错误代号,有很多错误代号,可以自行百度
            ERROR_SEVERITY(),               --错误的严重性
            ERROR_STATE(),                  --错误的状态码
            ERROR_PROCEDURE(),              --错误的存储过程
            ERROR_LINE(),                   --错误行号
            ERROR_MESSAGE()                 --错误信息
            );
       
        --execute dbo.pro_PrintError;--改存储过程会将ERROR_MESSAGE()在sql server信息窗口打印出来
END

exec pro_ErrorLog

调用  在catch中执行这个存储过程,回滚会插入失败,要注意。

我们公司目前的项目无法调用这个存储过程,只能采用在 catch 中每行单个赋值,然后在事务完成以后进行插入到日志表里。

--声明
declare @errorMsg varchar(4000) = ''
declare @errorNumber int 
declare @errorSeverity int
declare @errorState int
declare @errorLine int
declare @errorProcedure varchar(126)


--catch中赋值
set @errorMsg = ERROR_MESSAGE()
set @errorNumber = ERROR_NUMBER()
set @errorSeverity = ERROR_SEVERITY()
set @errorState = ERROR_STATE()
set @errorLine = ERROR_LINE()
set @errorProcedure = ERROR_PROCEDURE()


--插入日志表,注意要判断有内容的时候才做插入
if @errorProcedure is not null
INSERT INTO [dbo].[ErrorLog]
(
    [UserName],
    [ErrorNumber],
    [ErrorSeverity],
    [ErrorState],
    [ErrorProcedure],
    [ErrorLine],
    [ErrorMessage]
)
    VALUES
(
    CONVERT(sysname, CURRENT_USER),--current_user ,这里值是dbo,dbo是每个数据库的默认用户,具有所有者权限
    @errorNumber,                 --错误代号,有很多错误代号,可以自行百度
    @errorSeverity,               --错误的严重性
    @errorState,                  --错误的状态码
    @errorProcedure,              --错误的存储过程
    @errorLine,                   --错误行号
    @errorMsg                 --错误信息
);
原文地址:https://www.cnblogs.com/Transmuter/p/15498844.html