繁体   English   中英

如果批量插入失败,SQL如何回滚事务

[英]SQL how to rollback transaction if bulk insert fails

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

这就是我一直在尝试的:

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

我会尝试一下。

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

这工作正常:

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

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

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

任何错误都会杀死批处理和事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM