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

jac*_*ill 15 sql-server-2008 sql-server error-handling

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

MSDN 指出:

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

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

Rem*_*anu 9

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
Run Code Online (Sandbox Code Playgroud)

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


Aar*_*and 6

不,它不能帮助您找出错误发生的位置。这是一个快速示例。如果您尝试除以 0,您会收到一条包含大量详细信息的错误消息:

SELECT 1/0;
Run Code Online (Sandbox Code Playgroud)

结果:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
Run Code Online (Sandbox Code Playgroud)

看到一个名为State,值为 1 的吗?ERROR_STATE()返回这个值。所以如果你使用TRY/CATCH

BEGIN TRY
  SELECT 1/0;
END TRY
BEGIN CATCH
  SELECT ERROR_STATE();
END CATCH
Run Code Online (Sandbox Code Playgroud)

结果:

----
   1
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 是的,@AaronBertrand 提出了一堆你自己的观点来与你的正确答案竞争。 (4认同)
  • @jaczjill 有时您会希望您的应用程序根据 error_state 和错误处理架构的复杂性以某种方式响应,但我怀疑像这样广泛地处理错误的情况很少见。错误编号本身(捕获*特定*错误)或错误严重性更常见。我不记得曾经看到任何人以有意义的方式使用错误状态,除非在演示中显示它存在。 (2认同)
  • @jaczjill 没有多少技术人员比 Aaron 更了解 SQL Server,而且他们中的大多数人从未出现在这里。你的问题在这里得到了回答(很可能就像它所能去的那样)。 (2认同)