我尝试在事务中执行基本导入例程,因此我可以根据需要进行ROLLBACK / COMMIT,并通过屏幕消息提醒此人。
当文件丢失/未找到时,我收到以下错误:
Msg 4860,Level 16,State 1,Line 5 无法批量加载。文件" FileToImport"不存在。
但是,上面的错误消息似乎不会导致@@ ERROR递增...
I 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
提前致谢....
答案 0 :(得分:0)
有几件事。首先,@@ Error实际上会增加。请参阅以下内容:
此外,事务实际上是回滚,但是,当我调试您的查询时,我看到调试器甚至在执行IF @@ TRANCOUNT&gt; 0语句或其他语句之前立即跳转到SET NOEXEC OFF。请参阅https://msdn.microsoft.com/en-us/library/ms188394.aspx:当SET NOEXEC为OFF时,所有批次都在编译后执行。我相信这就是为什么你看到的只是print语句确实表明它是完整的,但实际上并非如此。
我找到了一个很好的交易示例,以及它们实际应该如何编写。请检查How to rollback or commit a transaction in SQL Server
希望这有帮助。