日期:2014-05-18  浏览次数:20603 次

存储过程中用bulk insert或bcp导csv文件内容到数据表中,发生错误,会是什么结果?
如某条数据和表结构不匹配。
bulk   insert或bcp做什么处理?   报错还是忽略?

能否捕捉该错误,并知道是哪一条数据。
能否回滚?

------解决方案--------------------
用bcp時加條件 bcp "select col1,col2 from 表名 "
------解决方案--------------------
在bcp中 指定-b( batch_size)选项
同时:
每个批处理作为一个事务复制至服务器。SQL Server 提交或回滚(在失败时)每个批处理的事务。默认情况下,指定的数据文件中的所有数据都作为一批复制。请不要与 -h "ROWS_PER_BATCH = bb " 选项一起使用。

------解决方案--------------------
联机帮助

批处理开关
bcp 实用工具和 BULK INSERT 语句接受以下两个开关,使用户得以指定在大容量复制操作中发送给 Microsoft® SQL Server™ 的每个批处理的行数。

Bcp 实用工具开关 BULK INSERT 子句
-b batch_size BATCHSIZE = batch_size
-h "ROWS_PER_BATCH = bb " ROWS_PER_BATCH = rows_per_batch


这两个开关的使用对数据插入操作如何记入日志有很大影响。

使用 -b 开关或 BATCHSIZE 子句
每一批行均作为单独的事务插入。如果因为某种原因,大容量复制操作尚未完成即终止,则只回滚当前的事务。例如,如果数据文件包含 1000 行,而使用的批处理大小为 100,SQL Server 会将该操作作为 10 个单独的事务来记录,每个事务将 100 行插入到目的表中。如果大容量复制操作在复制到 750 行时终止,SQL Server 回滚当前事务时只删除此前的 49 行。目的表中仍会包含前 700 行。

使用 ROWS_PER_BATCH
如果没有使用 -b 开关或 BATCHSIZE 子句,则将整个文件发送到 SQL Server,并将大容量复制操作视为单个事务。在这种情况下,ROWS_PER_BATCH 提示或 ROWS_PER_BATCH 子句可以用来提供估计的行数。SQL Server 根据批处理大小的值自动优化装载操作,从而优化性能。


说明 通常,批处理的大小越大,大容量复制操作的性能越好。使批处理的大小尽可能地大,尽管提示中的准确性并不重要。


如果因为某种原因,该操作尚未完成即终止,则将回滚整个事务,并且目的表中不会添加新行。

尽管数据文件中的所有行在一个批处理中复制到 SQL Server实例中,但 bcp 每发送 1000 行,就会显示 "已将 1000 行发送到 SQL Server "的消息。该消息仅作为信息提供,使用任何大小的批处理均会出现该消息。


说明 以不同的批处理大小同时提供上述两个开关会生成错误信息。


将较大的数据文件大容量复制到 SQL Server 实例中时,在大容量复制尚未完成时,事务日志可能已经写满,即使不记录行插入操作而只是记录扩展盘区的分配。在这种情况下,需扩大事务日志,允许它自动增长或使用 -b 或 BATCHSIZE 开关执行大容量复制,并将恢复模式设置为简单模式。因为只能截断已提交的事务,所以如果没有使用 -b 开关,则此选项在大容量复制操作过程中将不释放空间;整个操作作为单个事务记入日志。

bcp 实用工具和 BULK INSERT 语句还分别接受 KILOBYTES_PER_BATCH 提示或 KILOBYTES_PER_BATCH 子句,它们可以用来指定批处理中大约包含的数据量(以 KB 为单位)。SQL Server 可根据该值的设置优化大容量装载操作。

将数据从 SQL Server 实例大容量复制到数据文件时,批处理大小不适用。

------解决方案--------------------
bulk 会报错
bcp 你只能看 output 结果, 因为存储过程中调用 bcp 是用 cmd_shell, 这个不会只会原样显示在屏幕上打印到的结果.


应该不能定位到行
------解决方案--------------------
bulk insert会报错,可以定位到行 ,可以用maxError来忽略指定数量的错误。