在 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.
整个操作是否失败而实际上没有插入任何记录?重复键错误之前的记录是否已被插入?
有人能指出一个网站/文档,其中描述了出现错误时的批量插入操作吗?
谢谢大家的帮助!
答案1
Stack Overflow 上的问题SQL Server 批量插入是事务性的吗?,似乎回答了你的问题。
作为参考,是的,它们已被插入,除非您手动将批量插入输入到具有回滚功能的用户定义事务中。批量插入将每一行视为单独的插入。
答案2
您可以回滚插入。为此,我们首先需要了解两件事
BatchSize
:每个事务要插入的行数。默认值是整个数据文件。因此,数据文件处于事务中
假设您有一个包含 10 行的文本文件,其中第 8 行和第 7 行包含一些无效的详细信息。当您批量插入文件时(未指定或指定批处理大小),10 行中有 8 行会插入到表中。无效行(即第 8 行和第 7 行)会失败,并且不会被插入。
发生这种情况的原因是每个交易的默认MAXERRORS
计数为 10。
根据MSDN:
最大错误:
指定在取消批量导入操作之前允许数据中出现的最大语法错误数。批量导入操作无法导入的每一行都将被忽略并计为一个错误。如果未指定 max_errors,则默认值为 10。
因此,为了使所有 10 行都失败,即使其中一行无效,我们也需要设置MAXERRORS=1
,BatchSize=1
这里 BatchSize 的数量也很重要。
如果您指定 BatchSize 并且无效行位于特定批次内,它将仅回滚特定批次,而不是整个数据集。因此在选择此选项时要小心
希望这能解决问题。