【问题标题】:Inner mesage in SQL Server TRY/CATCHSQL Server TRY/CATCH 中的内部消息
【发布时间】:2020-01-16 11:32:36
【问题描述】:

我想在运行时处理我的程序中的错误

BACKUP DATABASE [MyDb] TO DISK = 'c:\Test.bak' WITH COMPRESSION;

命令。

如果我在没有TRY/CATCH 的情况下运行此命令,我会收到两个错误:

消息 3201,第 16 级,状态 1,第 24 行
无法打开备份设备“c:\Test.bak”。操作系统错误 5(访问被拒绝。)。

消息 3013,第 16 级,状态 1,第 24 行
BACKUP DATABASE 异常终止。

但是当我在此处显示的语句中使用TRY/CATCH 时,我只收到此错误的第二部分:

BEGIN CATCH
        select ERROR_MESSAGE()
END CATCH

返回的错误只是:

BACKUP DATABASE 异常终止。

我怎样才能得到两部分的错误?

【问题讨论】:

  • 简短的回答是您无法使用 T-SQL TRY/CATCH 获得所有错误消息。您需要放弃 T-SQL TRY/CATCH 并在客户端应用程序中获取错误,例如 SSMS 或 SQLCMD。
  • @GSerg 真的我想在我遇到错误时在我的日志表中记录错误消息。使用 THROW 命令我无法实现这个目标。
  • @M.R.Sadeghi,要将所有错误消息记录到表中,您需要在客户端应用程序中执行此操作。请注意,Ola Hallengren's SQL Server Maintenance Solution 正是为备份和索引维护做的,所以考虑使用它而不是重新发明轮子。
  • 作为更多参考,Erland 在他的博客的error handling section 中讨论了这个确切的情况。

标签: sql-server try-catch


【解决方案1】:

显然我误解了这个问题,所以从这里开始。

SELECT   
     ERROR_NUMBER() AS ErrorNumber  
    ,ERROR_SEVERITY() AS ErrorSeverity  
    ,ERROR_STATE() AS ErrorState  
    ,ERROR_LINE () AS ErrorLine  
    ,ERROR_PROCEDURE() AS ErrorProcedure  
    ,ERROR_MESSAGE() AS ErrorMessage;  

【讨论】:

  • 我删除了可能不相关的示例。谢谢
  • 这些函数都不允许检索错误链中上一个错误的错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2012-12-22
  • 2010-11-15
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多