为什么这不返回@@ERROR?

Why is this not returning an @@ERROR?

我正在尝试在交易中执行基本的导入例程,以便我可以 ROLLBACK/COMMIT 根据需要,以及通过屏幕消息提醒此人。

当文件丢失/找不到时,出现以下错误:

Msg 4860, Level 16, State 1, Line 5 Cannot bulk load. The file "FileToImport" does not exist.

然而,上面的错误消息似乎并没有导致@@ERROR 增加...

我 ROLLBACK/COMMIT 基于 @@ERROR <> 0 如下所示

我错过了什么?

这是我的代码大纲:

-- Start Transaction
BEGIN TRANSACTION

DECLARE @MyFile varchar(255)
SET @MyFile = 'FileToImport'

DECLARE @sql_string nvarchar(max)
SET @sql_string = N'INSERT INTO Some Table ....
.... FROM OPENROWSET (BULK ''' + @MyFile +''',FORMATFILE=''MyImportFormatFile.XML'',FIRSTROW = 2) as BulkLoadFile'

EXECUTE sp_executesql @sql_string;

-- Check For Error. If Error then print out a message to the screen and ROLLBACK
IF @@ERROR<>0
BEGIN
print('')
print('ALERT!!! There was an error and this step did NOT Commit to Database')
Print('')
ROLLBACK
SET NOEXEC ON
END

-- Since @@ERROR = 0 we can Commit Transaction (assuming something happened) and print out a message to the screen
IF @@TRANCOUNT>0 COMMIT TRANSACTION
SET NOEXEC OFF
PRINT ('')
PRINT ('FINISHED & COMMITTED')
PRINT ('')
-- End Transaction

提前致谢....

有几件事。首先,@@Error 实际上是递增的。请参阅以下内容:

此外,事务实际上回滚了,但是,当我调试您的查询时,我看到调试器甚至在执行 IF @@TRANCOUNT>0 语句或其他语句之前就立即跳转到 SET NOEXEC OFF。请参阅 https://msdn.microsoft.com/en-us/library/ms188394.aspx :当 SET NOEXEC 为 OFF 时,所有批处理在编译后执行。我相信这就是为什么您看到的只是表明它已完成但实际上并非如此的打印语句。

我找到了一个很好的事务示例以及它们实际上应该如何编写。请检查 How to rollback or commit a transaction in SQL Server

希望对您有所帮助。