2015-11-05 285 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 

任何錯誤會導致批處理和事務中斷。