SQL Server批量插入跳过主键冲突

时间:2016-12-09 16:58:33

标签: sql sql-server tsql bulkinsert

我目前正在使用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违规的行转发到同一错误文件。

1 个答案:

答案 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 查询。