25  
查询码: 00000389
SQLserver 存储过程执行错误记录到表 - JavaShuo
来源:http://www.javashuo.com/article/p-wkvfsgda-ee.html
作者: 周杨 于 2022年06月23日 发布在分类 / 计算机应用 / 数据库 / SQLSERVER ,于 2022年06月23日 编辑
存储 过程 sqlserver varchar 错误 教程 执行 message 记录 procedure

对于在执行存储过程当中碰到的一些错误,若是未及时捕获或者说传递给前端应用程序来,在这样的情形下,故障的排查显得尤其困难。基于此,咱们能够能够将这些错误信息记录到日志,同时也能够将其传递给前端应用程序。如本文的示例。前端

1.将错误信息记录到表


CREATE TABLE ErrorLog
(
    ID             INT IDENTITY ( 1, 1) NOT NULL,
    ErrorNumber     INT,
    ErrorMessage   VARCHAR( 1000),
    ErrorSeverity   INT,
    ErrorState     INT,
    ErrorLine       INT,
    ErrorProcedure VARCHAR( 128),
    ErrorDate       datetime
);

CREATE PROCEDURE CatchErrorDemo AS
--相关业务逻辑
BEGIN TRY
    SELECT 1 / 0;
END TRY
--相关错误捕获-
BEGIN
    CATCH
    PRINT 'Error Number:' + CAST( ERROR_NUMBER() AS VARCHAR( 10));
    PRINT 'Error Serverity: ' + CAST( ERROR_SEVERITY() AS VARCHAR( 10));
    PRINT 'Error State: ' + CAST( ERROR_STATE() AS VARCHAR( 10));
    PRINT 'Error Procedure: ' + ERROR_PROCEDURE();
    PRINT 'Error Line: ' + CAST( ERROR_LINE() AS VARCHAR( 10));
    PRINT 'Error Message: ' + ERROR_MESSAGE();
    INSERT INTO ErrorLog (ErrorNumber, ErrorSeverity, ErrorState, ErrorProcedure, ErrorLine, ErrorMessage, ErrorDate)
    VALUES ( ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE(),  GETDATE())
END CATCH;

--执行相关存储过程,并查询日志表,同时与系统消息表进行对比
EXEC CatchErrorDemo;
SELECT *
FROM ErrorLog;


2.传递错误信息


CREATE PROC CatchErrorDemo2 @a INT, @rtn VARCHAR( 20) OUTPUT, @rtn_message VARCHAR( 200) OUTPUT AS
BEGIN
    BEGIN TRY
        DECLARE @result INT;

        SET @result = 'A' + @a;
    END TRY BEGIN CATCH
        SET @rtn = @@ERROR;

        SET @rtn_message = 'Error Number: ' + CAST( ERROR_NUMBER() AS VARCHAR( 10)) + ' Error Serverity: ' +
                            CAST( ERROR_SEVERITY() AS VARCHAR( 10)) + ' Error State: ' +
                            CAST( ERROR_STATE() AS VARCHAR( 10)) + ' Error Procedure: ' + ERROR_PROCEDURE() +
                            ' Error Line: ' + CAST( ERROR_LINE() AS VARCHAR( 10)) + ' Error Message: ' + ERROR_MESSAGE();
    END CATCH;
END;
GO

--调用存储过程
DECLARE @rtn INT ,
    @rtn_message VARCHAR( 200);
EXEC CatchErrorDemo2 0, @rtn OUTPUT, @rtn_message OUTPUT;
PRINT @rtn;
PRINT @rtn_message;



245
Error Number: 245 Error Serverity: 16 Error State: 1 Error Procedure: CatchErrorDemo2 Error Line: 10
Error Message: 在将 varchar'A' 转换成数据类型 int 时失败。





 历史版本

备注 修改日期 修改人
CREAT 2022-06-23 10:21:40[当前版本] 系统管理员

知识分享平台 -V 5.1.4 -大信谛威