[英]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.