一、SQLServer数据库引擎错误

1、查询系统错误信息

   SQLServer在每个数据库的系统视图sys.messages中存储系统自定义(Message_id <= 50000)和用户自定义(Message_id>50000)错误消息。

2、系统错误信息的严重性级别

   得到的系统错误消息分为不同程度的严重性级别。严重性级别是通过数字来表示的,数字越小表示严重级别越低。反之则严重性越高。严重性较高的错误指示需要尽快解决问题。

二、用try...catch发现错误

try...catch结构
      

          begin try
        要执行的T-SQL代码,一旦错误将传递给catch块进行处理
      end try
      begin catch
        检索和处理错误信息的代码
      end catch
      正常执行的T-SQL语句

  • try:其中,try块是包含在begin try和end try之间的T-SQL代码段,在该代码段中一旦发生错误将传递给catch块,如果没有错误将直接执行catch块后面的代码。
  • catch:catch块是包含在begin catch和end catch之间的T-SQL代码段,在该代码段中检索和处理try块中的错误信息。

三、捕获错误的系统函数

  1. error_number()
    返回错误的ID号,对应sys.messages系统视图中的message_id字段。
  2. error_line()
    返回T-SQL代码中错误出现的语句行数。
  3. error_message()
    返回将返回给应用程序的消息文本。该文本包括为所有可替换参数提供的值,如长度、对象名或时间。对应sys.messages系统视图中的text字段。
  4. error_procedure()
    返回出现错误的存储过程或触发器名称。如果在存储过程或触发器中未出现错误,该函数返回NULL。
  5. error_severity()
    返回错误的严重性级别。对应sys.messages系统视图中的severity字段。
  6. error_state()
    返回状态

示例:

begin try
select 1/0
end try
begin catch
select
error_number() as 'number',
error_line() as 'line',
error_message() as 'message',
error_severity() as 'severity',
error_state() as 'state'
end catch

输出结果如图所示:


四、用@@ERROR捕获上一条语句的错误

T-SQL还提供了一个简单的系统函数@@ERROR来捕获上一条语句的错误。如果上一条语句执行成功。@@ERROR系统函数将返回0;如果上一条语句生成错误,      @@ERROR将返回错误号。

每条语句完成时@@ERROR都会更改。

例如:

select 1/0
select * from sys.messages where message_id = @@error and language_id = 2052

结果如图:


五、用RAISERROR反馈错误

功能:

将生成的SQLServer引擎错误或警告信息(从sys.messages系统视图获得)反馈到应用程序中。sys.messages系统视图中由SQLServer自身定义的信息,其        message_id列的值小于等于5000。

返回用户使用存储过程sp_addmessage创建的自定义消息(存储在系统视图sys.messages中,其message_id大于50000)。

与print语句的区别:

print语句是T-SQL提供的用于反馈信息的语句,print语句只能反馈字符串或字符串表达式的值。

raiserror语句除了print语句的功能外,还支持类似C语言仲printf函数的字符串替换功能。这样可以先在字符串中定义要替换的数据的类型和位置,在输出时自动      将字符串内容进行替换。

语法: 

raiserror({ msg_id | msg_str | @local_variable })
        { ,severity,state }
         [ ,argument [ ,...n ] ] )
         [ with option [,...n] ]

参数说明:

  • msg_id:存储在sys.messages系统视图中的错误消息号(message_id)。如果是用户使用as_addmessage系统存储过程自定义的错误消息,其错误号应当大        于50000.如果未指定msg_id,则返回一个错误号为50000的错误消息。
  • msg_str:用户自定义消息,msg_str是一个字符串,具有可选的嵌入转换规格。每个转换规格都会定义参数列表中的值。如何格式化并将其置于msg_str中转        换规格位置上的字段中,转换规格的格式如下:%[[flag][width][.precision][{h|1}]]type。
  • @local_variable:包含按照msg_str的方式格式化的字符串的任何有效字符串数据类型的变量。@local_variable的数据类型必须为char或varchar,或者必须        能够隐式转换为这些数据类型。
  • severity:用户定义的与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,paiserror上指定的严重性将覆盖            sp_addmessage中指定的严重性。
  • state:状态号,1至少127之间的任意整数。如果在多个位置引发相同的用户自定义错误,则针对每个位置使用唯一的状态好有助于找到引发错误的代码段。
  • argument:用于代替msg_str或对应于msg_id的消息中的定义的变量的参数。可以有0个或多个替代参数,但是替代参数的总数不能超过20个。
  • option:错误的自定义选项。LOG:在SQLServer数据库引擎实例的错误日志和应用程序日志中记录错误;NOWAIT:将消息立即发送给客户端;SETERROR:将        @@ERROR值和ERROR_NUMBER值设置为msg_id或50000,不用考虑严重级别。

SQL Server错误处理的更多相关文章

  1. SQL Server 错误日志过滤(ERRORLOG)

    一.背景 有一天我发现SQL Server服务器的错误日志中包括非常多关于sa用户的登陆错误信息:“Login failed for user 'sa'. 原因: 评估密码时出错.[客户端: XX.X ...

  2. SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

    在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...

  3. [AlwaysOn Availability Groups]SQL Server错误日志(AG)

    SQL Server错误日志(AG) SQL Server错误日志会记录影响AG的时间,比如: 1.和Windows故障转移集群交互 2.可用副本的状态 3.可用数据的状态 4.AG endpoint ...

  4. SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...

  5. SQL Server 错误日志收缩(ERRORLOG)

    一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文 ...

  6. 已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

    操作SQLServer数据库时.遇到这种问题:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 经过查找材料了解为资源抢占,照成死锁,杀死进程就OK了.详细操作 ...

  7. SQL Server自动化运维系列 - 监控磁盘剩余空间及SQL Server错误日志(Power Shell)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...

  8. Microsoft OLE DB Provider for SQL Server 错误 '80040e21'

    我的是因为数据库满了,正在向服务商申请增加数据库容量 原文地址:Microsoft OLE DB Provider for SQL Server 错误 '800作者:欧阳IT记事本 昨天打开网站还正常 ...

  9. SQL Server:错误处理及事务控制

    目录: 解读错误信息 RAISERROR THROW 实例 使用 @@ERROR 使用 XACT_ABORT 使用TRY/CATCH 现实中的事务语句 删除 更新 银行取钱 解读错误信息 Msg 54 ...

  10. sql server 错误日志errorlog

    一 .概述 SQL Server 将某些系统事件和用户定义事件记录到 SQL Server 错误日志和 Microsoft Windows 应用程序日志中. 这两种日志都会自动给所有记录事件加上时间戳 ...

随机推荐

  1. 学习ThinkPHP笔记

    学习ThinkPHP笔记 TP的模块化设计 名称 描述 应用 基于同一个入口文件访问的项目我们称之为一个应用. 模块 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录. 控制器 ...

  2. rpm包的rpmbuild spec文件详解

    http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rp ...

  3. histoty显示时间戳

    设置Linux可以查看历史命令的执行时间     大家都知道Linux平台上,可以通过history命令查看最近所执行过的命令,但history命令默认所显示的只有编号和命令的,只知道命令是最近所执行 ...

  4. C# 指针操作相关

    C# 指针操作相关 =========================================            // ** 取int 地址 以指针访问指向值 ** //         ...

  5. Angular的第一个helloworld

    在安装了node,npm,angular-cli,vscode之后,我们来创建一个angular的应用 创建第一个hello world 使用的IDE工具为vscode 打开vscode,打开一个命令 ...

  6. EventProxy流程控制

    EventProxy流程控制 EventProxy是一个通过控制事件触发顺序来控制业务流程的工具. 1. 利用事件机制解耦复杂业务逻辑2. 移除被广为诟病的深度callback嵌套问题3. 将串行等待 ...

  7. 一:idea中使用eclipse主题快捷键

    idea -->file -->import settings -->keymap-shkstart.jar 1 执行(run) alt+r 2 提示补全 (Class Name C ...

  8. CentOS 忘记root密码(重置root密码)

    首先开机选择Advanced options for ****这一行按回车: 然后选中最后是(recovery mode)这一行按"E"进入编辑页面: 将ro recovery改为 ...

  9. Java异常(一)Java异常简介及其框架

    Java异常(一)Java异常简介及其框架 概要 本章对Java中的异常进行介绍.内容包括:Java异常简介Java异常框架 Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机 ...

  10. IDEA 构建为了打 jar 包的工程,包含 maven 打 jar 包的过程

    前言:最近自己写了一个单表查询的组件,包含前端.后台,所以需要向阿里的 druid 一样将所有文件打到一个 jar 包里,这里首先记录如何打 jar 包. 附:自己的一个 jar 包源码 https: ...