我目前正在使用SQL Server的Native Bulk Insert过程将多个表从文本文件加载到数据库中。
这一直运行良好,甚至可以优雅地处理截断,null和格式错误。如果任何列太大,则在不应该为空时为null,或者如果根据格式文件找到的列数不正确,则会跳过这些行并将其转发到错误文件。
但是,最近,我的一个文本文件中输入了一个重复的主键。这导致批量插入失败,没有行被转发到错误文件。
目前我的批量插入命令如下所示:
BULK INSERT table.table FROM 'data_file.txt' WITH(
BATCHSIZE = 100000,
CODEPAGE = 1252,
DATAFILETYPE = 'char',
FIRSTROW = 2,
KEEPNULLS,
MAXERRORS = 1000000000,
TABLOCK,
FORMATFILE = 'format_file.txt',
ERRORFILE = 'error_file.txt'
)
是否有办法使用批量插入来处理主键违规,与处理其他错误的方式相同?理想情况下,我希望将包含PK违规的行转发到同一错误文件。
答案 0 :(得分:6)
要直接回答您的问题,否。
UNIQUE和PRIMARY KEY约束始终强制执行。导入到使用NOT NULL约束定义的字符列时,BULK INSERT在文本文件中没有值时插入空字符串。
我建议您为批量插入使用临时表或临时表,并将其从那里移动到实际表中。
没有CHECK_CONSTRAINTS
选项的 BULK INSERT
也会对您的表格产生其他影响:
CHECK_CONSTRAINTS
指定在批量导入操作期间必须检查目标表或视图上的所有约束。如果没有CHECK_CONSTRAINTS选项,则忽略任何CHECK和FOREIGN KEY约束,并且在操作之后,表上的约束被标记为不可信。
如果您之后没有 negatively impact performance ,可以 fix it 查询。