数据库引擎错误严重性

适用于: SQL Server

当错误是由 SQL Server 数据库引擎引起时,此错误的严重性可说明 SQL Server 所遇到问题的类型。

严重性级别

下表列出并说明 SQL Server 数据库引擎所引起错误的严重级别。

严重性级别 说明
0-9 返回不太严重的状态信息或报表错误的信息性消息。 数据库引擎不会引起严重级别为 0 到 9 的系统错误。
10 返回不太严重的状态信息或报表错误的信息性消息。 由于兼容性原因,数据库引擎在将错误信息返回到调用应用程序前将严重性级别从 10 转换为 0。
11-16 指示可由用户纠正的错误。
11 指示给定的对象或实体不存在。
12 特殊严重性,用于因特殊查询提示而不使用锁定的查询。 在某些情况下,因为没有用锁保证一致性,由这些语句所执行的读取操作会产生不一致的数据。
13 指示事务死锁错误。
14 指示安全性相关错误,如权限被拒绝。
15 指示 Transact-SQL 命令中的语法错误。
16 指示可由用户纠正的常规错误。
17-19 指示无法由用户纠正的软件错误。 请将问题通知系统管理员。
17 指示语句导致 SQL Server 用尽资源(如数据库的内存、锁或磁盘空间)或超出了系统管理员设置的某些限制。
18 指示数据库引擎软件中有问题,但可完成执行语句,并且可维护到数据库引擎实例的连接。 每当出现严重级别为 18 的消息时均应通知系统管理员。
19 指示超出了不可配置的数据库引擎限制并且当前批处理已终止。 严重级别为 19 或更高的错误消息将停止执行当前的批处理。 严重级别为 19 的错误很少,必须由系统管理员或主要支持提供商更正。 当引发严重级别为 19 的消息时,请与系统管理员联系。 严重级别从 19 到 25 的错误消息均写入错误日志。
20-24 指示系统问题并且是致命错误,这意味着正在执行某语句或批处理的数据库引擎任务已停止运行。 此任务记录了所发生事件的有关信息,然后终止。 在大多数情况下,应用程序与数据库引擎实例的连接也可能终止。 如果发生这种情况,该问题可能使应用程序无法重新连接。

此范围内的错误消息可以影响同一数据库中所有正在访问数据的进程,并可能指示数据库或对象已损坏。 严重级别从 19 到 24 的错误消息均写入错误日志。
20 指示语句遇到了问题。 由于该问题只影响了当前任务,数据库本身未必已经损坏。
21 指示遇到了影响当前数据库中所有任务的问题,但数据库本身未必已经损坏。
22 指示消息中所指定的表或索引因软件或硬件问题而损坏。

很少发生严重级别为 22 的错误。 如果发生这种错误,请运行 DBCC CHECKDB 以确定数据库中的其他对象是否也已损坏。 这种问题可能只是出现在缓存中而不存在于磁盘本身。 如果发生此错误,请重新启动数据库引擎实例更正此问题。 若要继续工作,则必须重新连接到数据库引擎实例;否则,请使用 DBCC 修复该问题。 在某些情况下,可能需要还原数据库。

如果重新启动数据库引擎的实例不能解决此问题,那么问题就是出在磁盘上。 有时,销毁错误消息中指定的对象可以解决此问题。 例如,如果消息报告数据库引擎的实例在非聚集索引中发现了长度为 0 的行,则请删除该索引并重建。
23 指示整个数据库的完整性因硬件或软件问题而出现问题。

很少发生严重级别为 23 的错误。 如果发生这种错误,请运行 DBCC CHECKDB 以确定损坏的程度。 这种问题可能只是出现在缓存中而未出现在磁盘本身。 如果发生此错误,请重新启动数据库引擎实例更正此问题。 若要继续工作,则必须重新连接到数据库引擎实例;否则,请使用 DBCC 修复该问题。 在某些情况下,可能需要还原数据库。
24 指示介质故障。 系统管理员可能需要还原数据库。 您可能还需要致电硬件供应商。

用户定义的错误消息严重性

可以使用 sp_addmessage 将严重级别为 1 到 25 的用户定义错误消息添加到 sys.messages 目录视图中。 这些用户定义的错误消息可供 RAISERROR 使用。 有关详细信息,请参阅 sp_addmessage (Transact-SQL)

可用 RAISERROR 生成严重性级别为 1 到 25 的用户定义错误消息。 RAISERROR 可以引用 sys.messages 目录视图中存储的用户定义错误消息,也可以动态构建消息。 生成错误时如果使用 sys.messages 中的用户定义错误消息,则 RAISERROR 指定的严重级别将覆盖 sys.messages 中指定的严重级别。 有关详细信息,请参见 RAISERROR (Transact-SQL)

错误严重性和 TRY...CATCH

TRY...CATCH 构造可捕捉所有严重级别大于 10 但不终止数据库连接的执行错误。

严重级别从 0 到 10 的错误是信息性消息,并不导致执行从 TRY...CATCH 构造的 CATCH 块中跳转。

终止数据库连接的错误(通常严重级别为 20 到 25)不由 CATCH 块处理,因为连接终止后执行也中止了。

有关详细信息,请参阅 TRY...CATCH (Transact-SQL)

检索错误严重性

系统函数 ERROR_SEVERITY 可用来检索导致 TRY...CATCH 构造的 CATCH 块运行的错误的严重性。 如果是在 CATCH 块的作用域之外调用 ERROR_SEVERITY,则 ERROR_SEVERITY 返回空值。 有关详细信息,请参阅 ERROR_SEVERITY (Transact-SQL)

另请参阅