开发者社区> leshami> 正文

SQLserver 存储过程执行错误记录到表

简介: 对于在执行存储过程中碰到的一些错误,如果未及时捕获或者说传递给前端应用程序来,在这样的情形下,故障的排查显得尤为困难。
+关注继续查看

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

一、将错误信息记录到表

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;

这里写图片描述

二、传递错误信息

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 时失败。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
sqlserver 通用分页存储过程
来源:http://www.jb51.net/article/19936.htm CREATE PROCEDURE commonPagination @columns varchar(500), --要显示的列名,用逗号隔开 @tableName varchar(100), --要查询...
705 0
MSSQL SERVER 2008 R2 无法连接到数据库,用户sa登录失败,错误:18456
原因:勾选了强制实施密码策略,但是设置的密码很简单依然可以,比如:123456 这是为什么?原来,这个功能要用到NetValidatePasswordPolicy() API这个函数。 (该功能只有在安全要求较高的时候才用) 解决方法:在运行里输入 gpedit.msc 打开 “本地策略”编辑器依次 展开“计算机配置” “Windows设置”-“安全设置”-“帐户策略”-“密码策略",“密码必须符合复杂性要求”应该是禁用状态, 改为已启用,之后再创建SQL Server用户即可。
1519 0
在mongodb服务器上存储和执行 js 函数 - 存储过程
虽然官方不推荐使用将业务逻辑存储在数据库中,并且提示在 mongodb 中执行 javascript 存在性能限制。 但实际上,将 javascript 函数存储在 mongodb 中执行,还是非常有必要的,更方便,许多场景下性能会更好(在执行大量查询处理时不需要将数据传回客户端引擎)。 在目前的版本中,我们任然可以将 javascript 函数存储在 mongodb 内置的一个特殊集合 db.system.js 中,然后这些变量就可以在任何 mongodb 的 javascript 上下文中调用,包括:db.eval()、$where子句、mapReduce。 自从 mongodb 3
132 0
【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
55 0
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
127 0
[20121214]数据库错误记录.txt
[20121214]数据库错误记录.txt--自己参照许多文档,写了一个检测数据库错误的例子:--以sys用户登录,建立表CREATE TABLE SYS.ERROR_LOG(  IP_ADDRESS       VARCHAR2(30 BYTE),  USER...
646 0
SQLSERVER存储过程语法详解
SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ]     [ { @parameter data_type }         [ VARYING ] [ = default ] [ OUTPUT ]     ] [ ,...n ]   [ WITH     { RECOMPILE | ENCRY
1510 0
【错误记录】Android Studio 编译时 Kotlin 代码编译报错 ( Not enough information to infer type variable T )
【错误记录】Android Studio 编译时 Kotlin 代码编译报错 ( Not enough information to infer type variable T )
29 0
+关注
leshami
传播知识,分享快乐!十年以上数据库,系统运维与管理,性能优化经验。全部文章,欢迎扩散,转载请注明出处!
639
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载