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
无效也总是返回零。
确定是否发生某种错误的最简单方法是什么?
谢谢,
这是因为在您在块中捕获并处理它之后,它的值@@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)