数据库日志接口说明

-------------------------------------------------------------------------------------
日志记录存储过程参数为:处理号,处理日期,处理模块,日志信息,日志类型(BA、IE)
sp_LogUtil(
@Log_No int,
@Process_Datetime datetime,
@Process_Module nvarchar(50),
@Message nvarchar(1024),
@LogType nvarchar(2)
)
备注:1、BA表示Batch处理日志
      2、IE表示导入导出处理日志
      3、处理号为对应的Sequence号,调用dbo.sp_ GetSequence取得处理号

程序片断:
-------------------------------------------------------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go





-- =============================================
-- Author:    xxx
-- Create date: 2007/07/01
-- Description:    该存储过程用来记录日志
-- =============================================
ALTER PROCEDURE [dbo].[sp_LogUtil](
@Log_No int,
@Process_Datetime datetime,
@Process_Module nvarchar(50),
@Message nvarchar(1024),
@LogType nvarchar(2)
)
AS
DECLARE
  -- 业务参数
  @Log_Seq_NO     int,            -- 内部处理号
  -- 定义异常的参数
  @ErrorSeverity  int,                  -- 异常级别
  @ErrorState            int,                  -- 异常状态
  @ErrorMessage        nvarchar(4000); -- 异常消息
BEGIN
 
    SET NOCOUNT ON;
 
    BEGIN TRY
        -- 开始事务
        BEGIN TRANSACTION log_transaction
   
        -- 批处理日志
        IF @LogType=N'BA'
            BEGIN
            -- 设定内部处理号
            SELECT @Log_Seq_NO=COUNT(Batch_No)+1 FROM XX_LG_Batch WHERE Batch_No=@Log_No;
     
            -- 插入日志
            INSERT INTO XX_LG_Batch(
                                       Process_Datetime
                                      ,Process_Module
                                      ,[Message]
                                      ,Batch_No
                                      ,Batch_Seq_NO )
                                    VALUES(
                                       @Process_Datetime
                                      ,@Process_Module
                                      ,@Message
                                      ,@Log_No
                                      ,@Log_Seq_NO );
            END
        ELSE IF @LogType=N'IE'
            BEGIN
            -- 设定内部处理号
            SELECT @Log_Seq_NO=COUNT(ImportExport_No)+1 FROM XX_LG_ImportExport WHERE ImportExport_No=@Log_No;
     
            -- 插入日志
            INSERT INTO XX_LG_ImportExport(
                                         Process_Datetime
                                        ,Process_Module
                                        ,[Message]
                                        ,ImportExport_No
                                        ,ImportExport_Seq_No )
                                    VALUES(
                                         @Process_Datetime
                                        ,@Process_Module
                                        ,@Message
                                        ,@Log_No
                                        ,@Log_Seq_NO );
            END
   
        -- 确认事务
        COMMIT TRANSACTION log_transaction;
    --
     END TRY
    -- 捕获异常,不影响主程序运行,只将日志记录的事务回滚
BEGIN CATCH
    -- 回滚事务
    ROLLBACK TRANSACTION log_transaction;
 
    IF @LogType=N'BA'
        BEGIN
      -- 可以利用临时表来最后统一处理日志
            -- 将日志信息插入到临时表中
          DECLARE @Log_Sql nvarchar(1024);
          SET @Log_Sql = 'INSERT INTO @BatchTable VALUES(''' +
                                      CAST (@Process_Datetime AS nvarchar) + ''',''' +
                                                      @Process_Module + ''',''' +   
                                                      @Message + ''',''' +           
                                                      CAST (@Log_No AS nvarchar) + ''',''' +
                                                      CAST (@Log_Seq_NO AS nvarchar)    +
                                                      ''')';
          EXEC sp_executesql @Log_Sql;
        END
 
  -- 捕获异常,获得异常参数
    SET @ErrorMessage  = ERROR_MESSAGE();
    SET @ErrorSeverity = ERROR_SEVERITY();
    SET @ErrorState    = ERROR_STATE();
 
    -- 抛出异常
    RAISERROR(
    @ErrorMessage,
    @ErrorSeverity,
    @ErrorState );
END CATCH

-------------------------------------------------------------------------------------

关联知识:
-------------------------------------------------------------------------------------
RAISERROR (
    { msg_id | msg_str | @local_variable }
    { ,severity ,state }
    [ ,argument [ ,...n ] ] )
    [ WITH option [ ,...n ] ]

RAISERROR (N'This is message %s %d.', -- Message text.
           10, -- Severity,
           1, -- State,
           N'number', -- First argument.
           5); -- Second argument.
-- The message text returned is: This is message number 5.


在严重级别为 10 或更低的情况下在 TRY 块中运行。
在严重级别为 20 或更高的情况下终止数据库连接。

备注:对于严重级别为 1 到 10 的消息,@@ERROR 默认值为 0

begin try
  raiserror(
     'test a serverity 11 error'
    ,11
    ,1);
end try
begin catch
  print 'catch an error ' + cast(error_severity() as nvarchar);
end catch
-- catch an error 11

begin try
  raiserror(
     'test a serverity 10 error'
    ,10
    ,1);
end try
begin catch
  print 'catch an error ' + cast(error_severity() as nvarchar);
end catch
-- test a serverity 10 error

使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。
用户定义错误消息的错误号应当大于 50000。如果未指定 msg_id,则 RAISERROR
引发一个错误号为 50000 的错误消息。

severity
用户定义的与该消息关联的严重级别。当使用 msg_id 引发使用 sp_addmessage
创建的用户定义消息时,RAISERROR 上指定的严重性将覆盖 sp_addmessage 中指定的严重性。

任何用户都可以指定 0 到 18 之间的严重级别。只有 sysadmin 固定服务器角色成员或
具有 ALTER TRACE 权限的用户才能指定 19 到 25 之间的严重级别。若要使用
19 到 25 之间的严重级别,必须选择 WITH LOG 选项。

state
介于 1 至 127 之间的任意整数。state 的负值默认为 1。值为 0 或大于 127 会生成错误。

如果在多个位置引发相同的用户定义错误,则针对每个位置使用唯一的状态号有助于找到引发
错误的代码段。

argument
用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。可以有 0 个或多个替代
参数,但是替代参数的总数不能超过 20 个。每个代替参数都可以是局部变量或具有下列任一
数据类型:tinyint、smallint、int、char、varchar、nchar、nvarchar、binary 或
varbinary。不支持其他数据类型。

% [[flag] [width] [. precision] [{h | l}]] type

flag

用于确定被替换值的间距和对齐的代码。

代码         前缀或对齐    说明 
-(减号)    左对齐        在给定字段宽度内左对齐参数值。
+(加号)    符号前缀      如果参数值为有符号类型,则在参数值的前面加上加号(+)或减号(-)。
0(零        零填充        在达到最小宽度之前在输出前面加上零。如果出现 0 和减号 (-),将忽略 0。
#(数字)   
对 x 或 X 的十六进制类型使用 0x 前缀
当使用 o、x 或 X 格式时,数字符号 (#) 标志在任何非零值的前面分别加上 0、
0x 或 0X。当 d、i 或 u 的前面有数字符号 (#) 标志时,将忽略该标志。
' '(空格)  空格填充 如果输出值有符号且为正,则在该值前加空格。如果包含在加号(+)标志中,则忽略该标志。
 
{h | l} type
与字符类型 d、i、o、x、X 或 u 一起使用,用于创建 shortint (h) 值或 longint (l) 值。

类型规范  表示 
d 或 i    有符号整数
o         无符号八进制数
s         字符串
u         无符号整数
x 或 X    无符号十六进制数
 
sp_addmessage @msgnum = 50005,
              @severity = 10,
              @msgtext = N'<<%7.3s>>';
GO
RAISERROR (50005, -- Message id.
           10, -- Severity,
           1, -- State,
           N'abcde'); -- First argument supplies the string.
-- The message text returned is: <<    abc>>.
GO
sp_dropmessage @msgnum = 50005;
GO
-------------------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值