BULK INSERT 操作文件是不是被当做一个Transcation?
早上看到网上有人问将文件导入数据库的问题,其实可以用BCP或者BULK INSERT处理,这样性能很好。后来牵扯到了错误处理的问题,如果用BULK INSERT,是不是需要显示的Transcation(begin tran).
以前一直认为BULK INSERT是将每条语句当做Transcation处理的,如果100条记录,一条失败99条成功,那么你的数据库将会产生99条数据。但是在MSDN上看到了其中一个参数的解释:
BATCHSIZE =感觉上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的解释真让人迷惑啊。