Java:如何使用SQL Server使用Java JDBC使用Identity列执行批处理插入



我有一个CSV文件,我需要使用SQLServerBulkCopy将其写入SQL Server表。我正在使用sqlserverbulkcsvfilerecord来加载文件。

目标表具有以下结构:

create table TEST
(
    ID int identity,
    FIELD_1 int,
    FIELD_2 varchar(20)
)

CSV文件具有以下结构:

4279895;AA00000002D
4279895;AA00000002D
4279895;AA00000002D
4279896;AA00000003E
4279896;AA00000003E
4279896;AA00000003E

您可以看到CSV中不存在ID(身份)列,我需要数据库自动在插入中添加身份值。我的问题是,只要表具有身份列,批量插入就无法正常工作,我会收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: Source and destination schemas do not match.
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.validateColumnMappings(SQLServerBulkCopy.java:1749)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:1579)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:606)

这是相关代码:

try (
        Connection targetConnection = DriverManager.getConnection(Configuration.TARGET_CONNECTION_URL);
        SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(targetConnection);
        SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord(csvPath, Charsets.UTF_8.toString(), ";", false);
) {
    SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
    copyOptions.setKeepIdentity(false);
    bulkCopy.setBulkCopyOptions(copyOptions);
    fileRecord.addColumnMetadata(1, null, java.sql.Types.INTEGER, 0, 0); // FIELD_1 int    
    fileRecord.addColumnMetadata(2, null, java.sql.Types.VARCHAR, 20, 0); // FIELD_2 varchar(20)
    bulkCopy.setDestinationTableName("TEST");                
    bulkCopy.writeToServer(fileRecord);
}
catch (Exception e) {
    // [...]
}

如果我从表中删除了身份列,则大量插入物可成功地结束。使用SQL Server使用Java JDBC执行身份插入的身份批量插入是哪个正确的?

我认为您不需要设置此选项copyOptions.setKeepIdentity(false);

删除此线后尝试。您可以参考此帖子以及带身份列

的sqlbulkcopy insert

如果您的带有空白值Helen的领先列,则身份将在插入物上生成。根据设置的不同,即使第一列不是空白,它也可能会生成新的身份。

因此,添加额外的列或使用另一个(登台)表。

顺便说一句,如果您有一个非常大的表,则命令行BCP实用程序是最快的。与JDBC批处理插件相比,从经验最多要快5倍。

最新更新