建表
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 --错误信息 );