SQL Server批量插入是否具有事务性?

时间:2020-03-05 18:47:05  来源:igfitidea点击:

如果我在SQL Server 2000查询分析器中运行以下查询:

BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWS_PER_BATCH = 10000, TABLOCK)

在一个符合OurTable模式的40行文本文件中,但随后更改了最后20行的格式(假设最后20行的字段较少),我收到错误消息。但是,前40行被提交到表中。我调用"批量插入"的方式是否有某些问题,使其无法进行事务处理,还是我需要做一些明确的事情来强制其在失败时回滚?

解决方案

回答

尝试将其放入用户定义的事务中,看看会发生什么。实际上,它应该按照描述进行回滚。

回答

BULK INSERT充当一系列单独的INSERT语句,因此,如果作业失败,它不会回滚所有已提交的插入。

但是,它可以放在事务中,因此我们可以执行以下操作:

BEGIN TRANSACTION
BEGIN TRY
BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
   ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH