@@ERROR 总是等于零

use*_*970 0 sql-server sql-server-2008

我有以下代码:

BEGIN TRY
   EXEC (@action_sql);
END TRY
BEGIN CATCH
   SELECT @change_id AS ChangeId,
          @action_sql AS sqlAttempted,
          ERROR_MESSAGE () AS ErrorMessage,
          ERROR_NUMBER () AS ErrorNumber,
          ERROR_SEVERITY () AS ErrorSeverity,
          ERROR_LINE () AS ErrorLine;
END CATCH;

IF @@ERROR = 0
   BEGIN
      PRINT '@@ERROR = ' + CAST (@@ERROR AS VARCHAR (10))
      PRINT 'COMMIT';
      COMMIT TRANSACTION;
   END
ELSE
   BEGIN
      PRINT '@@ERROR = ' + CAST (@@ERROR AS VARCHAR (10))
     PRINT 'ROLLBACK';
     ROLLBACK TRANSACTION;
   END;
Run Code Online (Sandbox Code Playgroud)

当我放入一个有效或无效的 SQL 语句时,@action_sql我总是会被打印出来

@@ERROR = 0
COMMIT
Run Code Online (Sandbox Code Playgroud)

@@ERROR即使action_sql无效也总是返回零。

确定是否发生某种错误的最简单方法是什么?

谢谢,

Shi*_*iva 5

这是因为在您在块中捕获并处理它之后,它的值@@ERROR被重置为0即没有错误TRY CATCH。因此,正确的做法是捕获错误值(如果有)并将其存储在变量中,然后根据变量是否表明发生了错误,使用这些变量采取进一步行动。

请参阅下面的示例代码。该@action_sql无效在第一种情况下,你会看到错误代码打印出来。在第二种情况下,@action_sql是有效的,您不会看到打印出任何错误代码。

第一个样本:无效@action_sql

declare @action_sql NVARCHAR(2000);
declare @change_id INT
declare @ErrorNumber int
declare @ErrorMessage  NVARCHAR(2000);

set @action_sql  = 'select * from sysobj;'

BEGIN TRY
   EXEC (@action_sql);
END TRY
BEGIN CATCH    
          SELECT 
          @ErrorMessage =  ERROR_MESSAGE(),
          @ErrorNumber = ERROR_NUMBER()
          -- ERROR_SEVERITY () AS ErrorSeverity,
          -- ERROR_LINE () AS ErrorLine;
END CATCH;

IF @ErrorNumber = 0
   BEGIN
      PRINT '@@ERROR = ' + CAST (@ErrorNumber AS VARCHAR (10))
      PRINT 'COMMIT';
      --COMMIT TRANSACTION;
   END
ELSE
   IF (@ErrorNumber > 0)
   BEGIN
      PRINT '@@ERROR = ' + CAST (@ErrorNumber AS VARCHAR (10))
     PRINT 'ROLLBACK';
     --ROLLBACK TRANSACTION;
   END;
Run Code Online (Sandbox Code Playgroud)

第二个样本:有效 @action_sql

declare @action_sql NVARCHAR(2000);
declare @change_id INT
declare @ErrorNumber int
declare @ErrorMessage  NVARCHAR(2000);

set @action_sql  = 'select top 10 * from sysobjects;'

BEGIN TRY
   EXEC (@action_sql);
END TRY
BEGIN CATCH    
          SELECT 
          @ErrorMessage =  ERROR_MESSAGE(),
          @ErrorNumber = ERROR_NUMBER()
          -- ERROR_SEVERITY () AS ErrorSeverity,
          -- ERROR_LINE () AS ErrorLine;
END CATCH;

IF @ErrorNumber = 0
   BEGIN
      PRINT '@@ERROR = ' + CAST (@ErrorNumber AS VARCHAR (10))
      PRINT 'COMMIT';
      --COMMIT TRANSACTION;
   END
ELSE
   IF (@ErrorNumber > 0)
   BEGIN
      PRINT '@@ERROR = ' + CAST (@ErrorNumber AS VARCHAR (10))
     PRINT 'ROLLBACK';
     --ROLLBACK TRANSACTION;
   END;
Run Code Online (Sandbox Code Playgroud)