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


13

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

MSDN指出:

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

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


Error_StateError_Number组合可以使您更清楚地了解错误。在这里
Ravindra Gullapalli

谢谢!但我也早先阅读了此链接。它没有帮助,因为在MSDN上没有为此提供好的示例。这就是为什么我在这里提出问题。

Answers:


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

查看这两种状态如何使您稍后区分遇到哪种错误情况。在您说“但我可以看一下错误消息”之前,我先告诉您一个词:国际化。


是的,这就是我想要的。:)现在都清除了!谢谢!
jaczjill 2013年

非常好的答案。从您的帖子中获得的知识可以帮助您更好地理解,然后访问此technet.microsoft.com/en-us/library/ms180031.aspx
kashif 2014年

6

不,它不能帮助您找到有关错误发生位置的任何信息。这是一个简单的例子。如果尝试除以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


谢谢,这有所帮助。由于我没有特权,因此无法投票赞成您的答案。但是,我想通过示例来说明此函数存在的原因。MSDN说ERROR_STATE()返回错误状态号,那我该怎么办!

2
@jaczjill有时您会希望您的应用程序根据error_state和错误处理体系结构的复杂性以某种方式做出响应,但是我怀疑这样处理错误的情况很少见。错误编号本身(捕获特定错误)或错误严重性更为常见。我不记得曾经见过有人以有意义的方式使用错误状态,除非在演示中显示了该错误状态。
亚伦·伯特兰

好了,谢谢亚伦:)另外,您能为这个问题设置赏金吗?这样一来,一些技术人员就可以挑战精确答案了。否则你就是赢家。

4
是的,@ AaronBertrand提出了一堆自己的观点来与您的正确答案竞争。
Zane 2013年

2
@jaczjill除了Aaron之外,没有多少人比其他人更了解SQL Server,而且大多数人从未在这里露过面。您的问题在这里得到了回答(很可能会尽可能地准确回答)。
dezso 2013年

1

简短答案-不能。ERROR_STATE本质上是ERROR_NUMBER的细分。它无法告诉您导致错误的代码行(除非ERROR_NUMBER和ERROR_STATE一起告诉您错误的原因,然后才清楚是什么原因)。


从概念上理解,它始终与ERROR_NUMBER()函数一起使用。但是,使用ERROR_STATE()和ERROR_NUMBER()的示例将完全阐明图片。否则任何良好的参考链接就足够了。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.