AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 35893
Accepted
jaczjill
jaczjill
Asked: 2013-02-28 06:19:21 +0800 CST2013-02-28 06:19:21 +0800 CST 2013-02-28 06:19:21 +0800 CST

SQL Server 中的 ERROR_STATE() 是什么以及如何使用它?

  • 772

我读到这ERROR_STATE()可以帮助区分源代码中可能发生相同类型错误的不同状态/位置。但我并不清楚它如何有用。

MSDN 状态:

ERROR_STATE()返回导致运行 TRY...CATCH 构造的 CATCH 块的错误的状态编号。

如何才能真正使用?有人能给我一个例子吗,这篇参考文章中提供的例子并不能很好地帮助我解释事情吗?

sql-server sql-server-2008
  • 3 3 个回答
  • 18296 Views

3 个回答

  • Voted
  1. Best Answer
    Remus Rusanu
    2013-03-05T06:37:33+08:002013-03-05T06:37:33+08:00

    SQL Server 错误状态的目的是让 SQL Server 开发团队能够在代码中识别引发系统错误的确切位置,因为在多个位置引发了许多错误。

    作为最终用户(即使用 SQL Server 的应用程序开发人员),您可以类似地使用传入的状态,RAISERROR以便您的产品支持人员可以识别过程引发错误的位置,例如:

    create procedure usp_my_proc
    as
    if <somecondition>
      raiserror(N'Error foo and bar', 16, 0);
    if <someothercondition>
      raiserror(N'Error foo and bar', 16, 1);
    go
    

    看看这两种状态如何让您稍后区分哪个错误案例被击中。在您说“但我可以查看错误消息”之前,我要告诉您一个词:国际化。

    • 11
  2. Aaron Bertrand
    2013-02-28T06:27:30+08:002013-02-28T06:27:30+08:00

    不,它不能帮助您找到有关错误发生位置的任何信息。这是一个简单的例子。如果您尝试除以 0,您会收到一条包含大量详细信息的错误消息:

    SELECT 1/0;
    

    结果:

    Msg 8134, Level 16, State 1, Line 1
    Divide by zero error encountered.
    

    看到名为State的,值为 1 吗?ERROR_STATE()返回此值。因此,如果您使用TRY/CATCH:

    BEGIN TRY
      SELECT 1/0;
    END TRY
    BEGIN CATCH
      SELECT ERROR_STATE();
    END CATCH
    

    结果:

    ----
       1
    

    就这样。在大多数情况下没有用。我建议您在深入了解听起来很有用的特定功能之前,更多地阅读一般的错误处理。

    http://msdn.microsoft.com/en-us/library/ms175976.aspx

    http://www.sommarskog.se/error_handling_2005.html

    • 8
  3. RB.
    2013-02-28T06:23:13+08:002013-02-28T06:23:13+08:00

    简短的回答 - 它不能。ERROR_STATE 本质上是 ERROR_NUMBER 的细分。它不能告诉你是哪一行代码导致了错误(除非 ERROR_NUMBER 和 ERROR_STATE 一起告诉你错误的原因,然后就很明显原因是什么)。

    • 1

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve