ERROR_STATE (Transact-SQL)

返回导致 TRY…CATCH 构造的 CATCH 块运行的错误状态号。

主题链接图标Transact-SQL 语法约定

语法

ERROR_STATE ( )

返回类型

int

返回值

当在 CATCH 块中调用时,返回导致 CATCH 块运行的错误消息的状态号。

如果在 CATCH 块作用域以外调用,则返回 NULL。

注释

某些错误消息可能在 MicrosoftSQL Server数据库引擎代码中多处出现。例如,几种不同情况下都可能发生“1105”错误。每个引发错误的特定情况都分配唯一的状态代码。

查看记录已知问题的数据库(如 Microsoft 知识库)时,可以使用状态号确定所记录的问题是否与曾遇到的错误相同。例如,如果一篇知识库文章讨论状态号为 2 的 1105 错误消息,而所收到的 1105 错误消息的状态号为 3,则您遇到的错误原因可能不同于该篇文章所报告的原因。

SQL Server 支持工程师也可以用错误中的状态代码在源代码中查找产生错误的位置,获取诊断问题所需的更多信息。

ERROR_STATE 可以在 CATCH 块范围内的任意位置调用。

ERROR_STATE 无论运行多少次,无论在 CATCH 块范围内的哪个位置运行,它都返回错误状态。这与 @@ERROR 之类的函数形成鲜明对比,后者只在导致错误的语句的下一个语句中或者在 CATCH 块的第一个语句中返回错误号。

在嵌套 CATCH 块中,ERROR_STATE 返回引用它的 CATCH 块范围特有的错误状态。例如,外部 TRY...CATCH 构造的 CATCH 块可能具有嵌套 TRY...CATCH 构造。在嵌套 CATCH 块中,ERROR_STATE 返回调用该嵌套 CATCH 块的错误状态。如果 ERROR_STATE 在外部 CATCH 块中运行,它将返回调用该 CATCH 块的错误状态。

示例

A. 在 CATCH 块中使用 ERROR_STATE

下面的示例显示一个会生成被零除错误的 SELECT 语句。结果将返回错误状态。

USE AdventureWorks;
GO

BEGIN TRY
    -- Generate a divide by zero error
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT ERROR_STATE() AS ErrorState;
END CATCH;
GO

B. 在包含其他错误处理工具的 CATCH 块中使用 ERROR_STATE

下面的示例显示一个会生成被零除错误的 SELECT 语句。结果将与错误状态一起返回有关错误的信息。

USE AdventureWorks;
GO

BEGIN TRY
    -- Generate a divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO