【问题标题】:how to efficiently catch errors when working with T-SQL使用 T-SQL 时如何有效地捕获错误
【发布时间】:2013-08-09 04:03:57
【问题描述】:

我正在寻找一种在不使用经典 try catch 的情况下捕获错误的方法,因为此代码不适用于我的 SQL 版本 (2005)

BEGIN TRY
    SELECT 1/0;
END TRY
BEGIN CATCH
    EXECUTE usp_GetErrorInfo;
END CATCH;

错误:

Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'TRY'.
Msg 156, Level 15, State 1, Line 6
Incorrect syntax near the keyword 'END'.

任何解决方法?还是我做错了什么?

【问题讨论】:

  • 只有评论,但 SQL Express 2012 是免费的。
  • :) 好的,但我有 10 多个数据库,我不想进入任何升级冒险......但是。
  • 我认为 2005 年支持 try/catch...您是否将其设置为以较低的兼容性级别运行?
  • sql server admin 新手...不知道 lkevel 的兼容性是什么

标签: sql-server tsql error-handling try-catch


【解决方案1】:

如果您设置了较低的 cpmapitbility 级别并且无法在不破坏某些内容的情况下更改它,那么我们捕获错误的旧方法是

DECLARE @Error INT 
DECLARE @ErrorMessage NVARCHAR(500)


SET @Error = 0  
SET @ErrorMessage = ''
BEGIN TRAN
IF @Error = 0 
   BEGIN
      Do something
      SET @Error = @@Error         
   END

IF @Error = 0 
   BEGIN
      Do something else
      SET @Error = @@Error         
   END

 --this code must be the last code in the proc or batch
IF @Error = 0
   BEGIN    
      COMMIT TRAN
   END 
ELSE
   BEGIN    
      ROLLBACK TRAN
   END 

关键是您必须在执行每个操作后检查错误。例如,对于三个分组的步骤不做一次。

【讨论】:

    【解决方案2】:
    BEGIN TRY
       Try Statement 1
       Try Statement 2
       ...
       Try Statement M
    END TRY
    BEGIN CATCH
       Catch Statement 1
       Catch Statement 2
       ...
       Catch Statement N
    END CATCH
    

    是标准的 try..catch 语法。 2005版本支持。详情请见here

    【讨论】:

    • 它和我发布的没有什么不同,你能解释一下为什么它在 2005 年可能不起作用吗?设置?
    • 查询似乎没问题。错误可能在 try...catch 块之外。你能发布完整的查询吗?
    • :) try catch 之外没有任何内容,如果我运行我的示例,我会收到错误消息
    • 请确认并发布您的 RDBMS 版本。您可以发布 SELECT @@VERSION 的结果吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2018-01-08
    • 2015-09-28
    • 2020-05-23
    • 2021-12-16
    • 2017-03-13
    相关资源
    最近更新 更多