关于Bulk insert处理疑惑
最近在用Bulk insert,有3个疑惑
BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.txt'
WITH (
FIELDTERMINATOR = '|',
ROWTERMINATOR = '|/n' ,
FIRSTROW=4
)
lineitem.txt
里的数据类型是这样的
/n
sample test /n
/n
2011/11/14|222|2222|
333|222|2222|/n
2011/11/15|222|2222|
444|222|2222|/n
1:我想从lineitem.txt的第四行开始读取数据,但实际操作过程中并没有将数据插到DB里,也没有报错。这是什么原因
2:我想用begin try和begin catch 来捕捉insert产生的异常,但实际情况是当出错时并没有跑到begin catch。而是把正确的数据插入,错误的数据没被插入
3:txt里的日期是2011/11/14 这种date型,但是DB确是datetime型,这个怎么处理啊
[解决办法]
1、BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.txt'
WITH (
FIELDTERMINATOR = '
[解决办法]
',
ROWTERMINATOR = '
[解决办法]
/n' ,
FIRSTROW=4
)把红字部分的/换成\
2、转换日期的问题,建议你插入一个临时表,然后用我文章里面的最后一部分的方法转换后再插入目标表:
http://blog.csdn.net/dba_huangzj/article/details/7657979
3、try catch怎么写要看你的写法了,而且有些错误级别如果非常低,说不定捕获不了,不过4年没编程,不是很记得了。
[解决办法]
1、lz设定的firstrow,是按照ROWTERMINATOR = '
[解决办法]
/n' 的分隔得到的第4行开始,lz这个数据无法分隔出第四行哦。 执行中没有语法错误,只是没有得到数据而已,所以没有报错。
2、同样道理,插入的数据产生的问题,并非是应用错误。 所以catch不到。只能进行逻辑判断。
3、lz这个涉及表与数据的匹配问题,这个就看lz想怎么用了,一般都是按照表设计为准。
[解决办法]
1:我想从lineitem.txt的第四行开始读取数据,但实际操作过程中并没有将数据插到DB里,也没有报错。这是什么原因
--> 1. txt文件中,数据行1,3跟数据行2,4的行终止符不一致.
2. 换行符应该是'\n',非'
[解决办法]
/n'.
2:我想用begin try和begin catch 来捕捉insert产生的异常,但实际情况是当出错时并没有跑到begin catch。而是把正确的数据插入,错误的数据没被插入
--> 加maxerrors参数: maxerrors=0
maxerrors: 指定允许在数据中出现的最大语法错误数,超过该数量后将取消大容量导入操作.大容量导入操作无法导入的每一行都将被忽略并且计为一个错误.如果未指定 max_errors,则默认值为10.
参考 http://technet.microsoft.com/zh-cn/library/ms188365(v=sql.105).aspx
3:txt里的日期是2011/11/14 这种date型,但是DB确是datetime型,这个怎么处理啊
--> date型可以赋值给datetime型,会自动补上时间 00:00:00.000