-------------------------------------------------------------------------------------
日志记录存储过程参数为:处理号,处理日期,处理模块,日志信息,日志类型(BA、IE)
日志记录存储过程参数为:处理号,处理日期,处理模块,日志信息,日志类型(BA、IE)
sp_LogUtil(
@Log_No int,
@Process_Datetime datetime,
@Process_Module nvarchar(50),
@Message nvarchar(1024),
@LogType nvarchar(2)
)
@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
-------------------------------------------------------------------------------------
程序片断:
-------------------------------------------------------------------------------------
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
-------------------------------------------------------------------------------------