当在SQL 2005数据库服务器上使用非常基本的BULK INSERT语句导入csv数据文件时,我收到了一些格式错误,然后出现重复键错误:
Msg 4864, Level 16, State 1, Line 1 Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 8625, column 6 (min_prc). Msg 4864, Level 16, State 1, Line 1 Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 8627, column 6 (min_prc). Msg 2627, Level 14, State 1, Line 1 Violation of PRIMARY KEY constraint [TABLE]. Cannot insert duplicate key in object [TABLE]. The statement has been terminated.
整个操作失败了没有插入任何logging? 在插入重复键错误之前是否有logging?
任何人都可以指向一个描述批量插入操作的网站/文档,以防错误吗?
谢谢大家的帮助!
堆栈溢出问题, SQL Server批量插入事务? ,似乎回答你的问题。
作为参考,是的,他们已经被插入,除非你手动input批量插入到用户定义的事务与回滚。 批量插入将每行作为单独的插入。
您可以回滚插入。 要做到这一点,我们首先需要理解两件事情
BatchSize:每个事务要插入的行数。 默认值是整个数据文件。 所以一个数据文件正在处理中
假设你有一个文本文件,其中有10行,第8行,第7行有一些无效的细节。 当您批量插入文件时没有指定批量或者指定批量大小,则有8个插入到表格中。 无效的行,即8日和7日失败,并没有被插入。
这发生,因为默认的MAXERRORS计数是每个事务10。
按照MSDN:
MAXERRORS:
指定批量导入操作取消之前数据中允许的语法错误的最大数量。 无法通过批量导入操作导入的每一行都会被忽略并计为一个错误。 如果未指定max_errors,则默认值为10。
所以即使一个是无效的,也要失败所有10行,所以我们需要设置MAXERRORS=1和BatchSize=1这里BatchSize的数量也很重要。
如果指定了BatchSize,并且无效行位于特定批处理内,则它将仅回滚特定批处理,而不是整个数据集。 所以select这个选项时要小心
希望这可以解决这个问题。