Java:如何使用Java jdbc for Sql Server对标识列执行批插入

Java:如何使用Java jdbc for Sql Server对标识列执行批插入,java,sql-server,jdbc,bulkinsert,Java,Sql Server,Jdbc,Bulkinsert,我有一个csv文件,需要使用它写入Sql Server表。我正在使用从文件加载数据 目标表具有以下结构: create table TEST ( ID int identity, FIELD_1 int, FIELD_2 varchar(20) ) 4279895;AA00000002D 4279895;AA00000002D 4279895;AA00000002D 4279896;AA00000003E 4279896;AA00000003E 4279896;AA00

我有一个csv文件,需要使用它写入Sql Server表。我正在使用从文件加载数据

目标表具有以下结构:

create table TEST
(
    ID int identity,
    FIELD_1 int,
    FIELD_2 varchar(20)
)
4279895;AA00000002D
4279895;AA00000002D
4279895;AA00000002D
4279896;AA00000003E
4279896;AA00000003E
4279896;AA00000003E
csv文件具有以下结构:

create table TEST
(
    ID int identity,
    FIELD_1 int,
    FIELD_2 varchar(20)
)
4279895;AA00000002D
4279895;AA00000002D
4279895;AA00000002D
4279896;AA00000003E
4279896;AA00000003E
4279896;AA00000003E
正如您所看到的,ID(identity)列不在csv中,我需要数据库在插入时自动添加identity值。 我的问题是,只要表具有标识列,大容量插入就无法工作,我得到了以下错误:

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) {

    // [...]

}

如果从表中删除标识列,则大容量插入将成功结束。使用java jdbc for Sql Server执行标识大容量插入的正确方法是什么?

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


请在删除此行后重试。你也可以参考这篇文章

我想你不需要设置这个选项
copyOptions.setKeepIdentity(false)


请在删除此行后重试。如果您有一个前导列的值为空,那么您也可以参考这篇文章

,插入时将生成标识。根据设置,它可能会生成新标识,即使第一列不是空的

因此,要么添加一个额外的列,要么使用另一个(staging)表


顺便说一句,如果您有一个非常大的表,那么命令行bcp实用程序是最快的。根据经验,与Jdbc批量插入相比,速度快5倍。

如果前导列的值为空,则在插入时将生成标识。根据设置,它可能会生成新标识,即使第一列不是空的

因此,要么添加一个额外的列,要么使用另一个(staging)表

顺便说一句,如果您有一个非常大的表,那么命令行bcp实用程序是最快的。根据经验,与Jdbc批量插入相比,速度快5倍