现在的位置: 首页 > 综合 > 正文

BULK INSERT 操作文件是不是被当做一个Transcation?

2013年10月21日 ⁄ 综合 ⁄ 共 1132字 ⁄ 字号 评论关闭

早上看到网上有人问将文件导入数据库的问题,其实可以用BCP或者BULK INSERT处理,这样性能很好。后来牵扯到了错误处理的问题,如果用BULK INSERT,是不是需要显示的Transcation(begin tran).

 

以前一直认为BULK INSERT是将每条语句当做Transcation处理的,如果100条记录,一条失败99条成功,那么你的数据库将会产生99条数据。但是在MSDN上看到了其中一个参数的解释:

 

BATCHSIZE =batch_size

指定批处理中的行数。每个批处理作为一个事务复制到服务器。如果复制操作失败,则 SQL Server 将提交或回滚每个批处理的事务。默认情况下,指定数据文件中的所有数据为一个批处理。有关性能注意事项的信息,请参阅本主题后面的“备注”。 (http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx

 

感觉上BULK INSERT将处理一个文件的过程当做一个Transcation.然后做了下面的测试,将TXT的数据导入到一张表:

 

TXT数据保存在D盘test.txt:

"John","Smith","bill@smith.com"
"Sara","Parker","sara@parker.com"
"Kelly","Reynold","kelly@reynold.com"

 

---create atable:

 

CREATETABLE [dbo].[Person](

 [FirstNmae] [varchar](50)NULL,

 [LastName] [varchar](50)NULL,

 [EmailAddress] [varchar](16)NULL

)ON [PRIMARY]

 

---use bulkinsert deal with data:

 

BULKINSERT PersonFROM'D:\test.txt'WITH(FIELDTERMINATOR='","')

 

BULKINSERT PersonFROM'D:\test.txt'WITH(FIELDTERMINATOR='","',BATCHSIZE=10000)--将条数据当做一个BATCH

 

错误如下:

 

Msg 4863, Level 16,State 1, Line 2

Bulk load data conversion error (truncation)for row 3, column 3 (EmailAddress).

 

两条数据成功一条数据失败,证明BULKINSERT是将每条数据当做一个Transcation处理的,所以我们需要显示的使用事务,使用TRY
CATCH
捕获错误进行Rollback

 

MSDN的解释真让人迷惑啊。

 

抱歉!评论已关闭.