【问题标题】:Using T-SQL, how can I catch the OS error code?使用 T-SQL,如何捕获操作系统错误代码?
【发布时间】:2014-06-02 10:06:23
【问题描述】:

Microsoft SQL Server 2005+

执行数据库备份时,我可能会在 SSMS 中收到此错误:

消息 3202,第 16 级,状态 2,第 5 行

写入“c:\dbbackup\dummy.bak”失败:112(磁盘空间不足。)

这里,112是操作系统错误代码,括号中的文字是操作系统错误文本。

我的问题是:如何以编程方式获取此信息?

如果我将 BACKUP 命令放在 TRY-CATCH 块中,那么我可以使用 ERROR_*() 函数,但它们都不包含此信息。

提到的 ERROR_*() 函数是:

  • ERROR_NUMBER(),
  • ERROR_MESSAGE()
  • ERROR_严重性()
  • ERROR_状态()
  • ERROR_过程()
  • ERROR_LINE()

我只能捕捉到错误消息(Msg 3202...等)第一行中显示的信息以及 SQL 错误文本:“BACKUP DATABASE is terminating exceptionly”(这是由 ERROR_MESSAGE 返回的() 函数)。

【问题讨论】:

    标签: sql-server error-handling


    【解决方案1】:

    Catch 块将仅返回最后/终止错误。有一个 Connect 项目:https://connect.microsoft.com/SQLServer/feedback/details/277335/incorrect-error-number-passed-to-catch-block#

    SSMS 是一个 .net 应用程序,它使用 SqlExeption 来捕获批处理中的所有异常。 Errors 属性是一个 SqlErrorCollection,它将包含所有错误(取决于 XACT_ABORT 设置)。目前,T-SQL 无法通过 TRY/CATCH 实现这一点

    【讨论】:

    • 感谢您的信息,亚诺斯。有两件事是开放的:1) 不知何故,Management Studio 正在捕获第一个(或该错误的根本原因)错误。它是如何做到的? 2)connect项于2007年被微软关闭,此后SQL server一共发布了4个版本。似乎他们没有解决这个问题,因为 4 个版本......
    【解决方案2】:

    Janos Berke 非常友善,回答了这个问题。链接:http://iamberke.com/post/2014/06/14/egymast-koveto-tobb-sql-hiba-kezelese.aspx#.U60vKr1V_cc 文本是匈牙利语,但问题是这基本上不能在纯 TSQL 中完成:您需要一个 SQLException .NET 对象来捕获多个错误。示例代码可以在链接下找到。 谢谢亚诺斯。

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2019-01-15
      • 2013-08-09
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2011-06-28
      • 1970-01-01
      相关资源
      最近更新 更多