2015-11-05 287 views
0

我已经写了一个查询来删除表中的所有行,然后从txt中批量插入。如果批量插入有问题,我不想丢失旧数据,所以我想回滚事务。SQL如何在批量插入失败时回滚事务

这是我一直想:

BEGIN TRANSACTION 
DELETE Users_Login 
BULK INSERT Users_Login FROM '\\STRMV1234\ - Some_Table.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2, CODEPAGE = 'ACP') 
COMMIT TRANSACTION 

但是如果我从表中失去一切的错误。我也尝试下面的代码,这也不起作用:

BEGIN TRY 
    BEGIN TRANSACTION 
     DELETE Users_Login 
     BULK INSERT Users_Login FROM '\\STRMV1234\ - Some_Table.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2, CODEPAGE = 'ACP') 
    COMMIT 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK 
END CATCH 
+1

请发布确切的错误信息。 – datagod

+0

您需要发布错误,有些错误不会触及try catch块。 – HLGEM

+0

将'BEGIN TRANSACTION ... COMMIT'移动到您的'TRY ... CATCH'之外# – ewahner

回答

0

我会试试这个。

BEGIN TRANSACTION 
DELETE FROM Users_Login 
BULK INSERT Users_Login FROM '\\STRMV1234\ - Some_Table.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2, CODEPAGE = 'ACP') 

IF @@ERROR = 0 
BEGIN 
COMMIT 
PRINT 'GOOD' 
END 
ELSE 
BEGIN 
ROLLBACK 
PRINT 'BAD' 
END 
0

这工作得很好:

Begin Try 

    Begin Tran 
    Truncate Table data 
    BULK INSERT data FROM '...\data.txt' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n', FIRSTROW = 1, CODEPAGE = 'ACP') 

    if @@TRANCOUNT > 0 Commit 
    print 'ok' 
End Try 
Begin Catch 
    print 'error' 
    if @@TRANCOUNT > 0 Rollback 
End Catch 
+0

hi朱利安,你的代码打印“OK”。但是,如果我只运行truncate-bulk插入行,则会出现以下错误:'Msg 4864,Level 16,State 1,Line 10 对于第3行,列,批量加载数据转换错误(类型不匹配或指定代码页的字符无效) 4(LogoutDate).' – lisovaccaro

0

最优雅的解决方案是XACT_ABORT基本上打开理智的错误处理。默认的是疯狂/不可预测的。

SET XACT_ABORT ON 
BEGIN TRANSACTION 
DELETE ... 
BULK INSERT ... 
COMMIT TRANSACTION 

任何错误会导致批处理和事务中断。