Java: как выполнить пакетную вставку со столбцом идентификаторов, используя java jdbc для Sql Server - PullRequest
0 голосов
/ 18 марта 2019

У меня есть CSV-файл, который мне нужно записать в таблицу Sql Server, используя SQLServerBulkCopy .Я использую 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, мне нужна база данных для автоматического добавления значения идентификатора при вставке.Моя проблема в том, что массовая вставка не работает, пока в таблице есть столбец идентификаторов. Я получил следующую ошибку:

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 для Sql Server?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Если у вас есть начальный столбец с пустыми значениями Хелен, идентичность будет сгенерирована при вставке.В зависимости от настроек он может генерировать новый идентификатор, даже если первый столбец не пуст.

Поэтому добавьте дополнительный столбец или используйте другую (промежуточную) таблицу.

Кстати, если у вас естьдействительно большая таблица - утилита командной строки bcp самая быстрая.По опыту до 5 раз быстрее по сравнению с пакетной вставкой Jdbc.

1 голос
/ 18 марта 2019

Я думаю, вам не нужно устанавливать эту опцию copyOptions.setKeepIdentity(false);

Попробуйте после удаления этой строки. Вы также можете сослаться на этот пост Вставка SqlBulkCopy со столбцом идентификаторов

...