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