【问题标题】:Retrieve Error text from SQL Server 2000 error从 SQL Server 2000 错误中检索错误文本
【发布时间】:2010-09-12 19:02:57
【问题描述】:

我需要帮助在 SQL Server 2000 中记录来自 T-SQL 的错误。我们需要记录我们捕获的错误,但无法获取与我们在 SQL Server Management Studio 前面相同的信息。

我可以在没有任何参数替换的情况下收到这样的消息:

SELECT MSG.description from master.dbo.sysmessages MSG
INNER JOIN sys.syslanguages LANG ON MSG.msglangID=LANG.msglangid
WHERE MSG.error=@err AND LANG.langid=@@LANGID

但我还没有找到任何找出错误参数的方法。我想看:

表 MYTABLE7 上的约束违反 MYCONSTRAINT2

不是

表 %s 上的约束违反 %s

谷歌搜索只发现了使用 DBCC OUTPUTBUFFER 的奇异方案,这些方案需要管理员访问权限并且不适合生产代码。如何获得带有参数替换的错误消息?

【问题讨论】:

    标签: asp.net sql-server error-handling


    【解决方案1】:

    FORMATMESSAGE(它也存在于 SQL Server 2000 中)允许您从上述 sysmessages 模板将消息构建为最终格式。

    但是,RAISERROR 命令(当您遇到错误时,这几乎是数据库引擎本身在内部调用的内容)已经发送了完整的文本,这些文本可以被捕获并记录在客户端中。 SSMS 是一个客户端,不会生成自己的消息:所有消息都来自数据库引擎。

    但是,我猜您想使用 T-SQL 记录 T-SQL 错误。坦率地说,您不能在 SQL Server 2000 上。太多的错误是批处理和范围中止,无法可靠地记录任何内容。

    您必须在 SQL Server 2005 上才能使用 TRY/CATCH/ERROR_MESSAGE,或者您在客户端中陷入陷阱,然后使用 log4net 之类的东西重新登录到 SQL Server。

    【讨论】:

      【解决方案2】:

      在 .Net 中,从 sql server 检索错误消息(以及 printraiserror 的任何输出)就像在 SqlConnection ( .FireInfoMessageEventOnUserErrors = True) 并处理连接的 InfoMessage 事件。 .Net 接收的数据与您在 SQL Server Management Studio 结果网格的 Messages 窗口中获得的数据相匹配。

      所有代码都在处理事件的函数中,您可以将其抽象化,以便您的所有连接都指向同一个方法,因此除了两行代码之外,应用程序的其余部分无需更改当你创建新的连接来设置属性和事件时(你已经把它抽象了,所以你只需要在一个地方做,对吧?

      这是我认为definitive error guide for SQL Server的链接。
      http://www.sommarskog.se/error-handling-I.html

      在某些情况下,即使发生错误,SQL Server 也会继续处理。请参阅上一个链接中标有 What Happens when an Error Occurs? 的标题。

      【讨论】:

      • 客户端系统是 ASP.NET Web 服务。错误消息是否清楚地显示在异常中?无论如何,我仍然想从 TSQL 执行此操作。 1,重新构建错误处理将是应用程序的重大返工。
      • ... 和 2,在某些情况下,需要记录过程中间的错误,但该错误不一定会导致过程完全失败。如果 .NET Sql 组件可以构造错误消息,这是否意味着该信息实际上在 TSQL 中可用?
      • 我一直在编辑我的回复以解决您的问题,但由于 SO 不会给您任何通知,因此我也将在此处发布。
      【解决方案3】:

      在网上的书籍中查找 Raiserror(描述)

      你会发现语法是这样的:

      RAISERROR ( { msg_id | msg_str } { , severity , state } 
          [ , argument [ ,...n ] ] ) 
          [ WITH option [ ,...n ] ] 
      

      错误参数如下:

      d or I Signed integer 
      o Unsigned octal 
      p Pointer 
      s String 
      u Unsigned integer 
      x or X Unsigned hexadecimal 
      

      从 VB 开始的任何语言都有能力捕捉这些并让您采取适当的行动。

      戴夫·杰

      【讨论】:

      • 我认为他想在 Transact-SQL(或者换句话说,在服务器端)而不是应用程序的客户端上获取它。
      【解决方案4】:

      您是否有可能很快升级到 SQL2005?如果是这样,您可能可以利用他们的 TRY/CATCH 模型更轻松地完成您想要做的事情。

      catch 中暴露的变量可以为您提供抛出错误的对象、行号、错误消息、严重性等。从那里,您可以记录它、发送电子邮件等。

      【讨论】:

      • 我希望他们升级到 2005!这是我的第一选择,但不在我的控制范围内。
      猜你喜欢
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2010-11-11
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多