Утилита BCP не может экспортировать данные в Linux с помощью JAVA:

Я попытался выполнить следующий фрагмент кода для экспорта данных (myFileName.csv):

bcp "select * from DataBase.schema.TABLE_NAME" queryout tableData.csv -c -t, , -S [server] -U [user] -P '[password(with special characters)]' > LogFile.txt 

приведенный выше код работает нормально в терминале.

Напротив, я пробовал один и тот же код с помощью java.

File dir = new File("Mydirectory");
    Path dataPath = Paths.get("tableData.csv");
    List<String> val = new ArrayList();
    val.add("bcp");
    val.add("\"select * from " + [Database] + ".[Schema]." + table_name + "\"");
    val.add("queryout");
    val.add(dataPath.toString());
    val.add("-c");
    val.add("-t");
    val.add(",");
    val.add("-S");
    val.add([server]);// ex: if Server is 10.0.0.1  then val.add("10.0.0.1");
    val.add("-U");
    val.add([user]); // ex: if User_name is TestA then val.add("TestA");
    val.add("-P");
    val.add([password(with special characters)]); // ex: if Password is [email protected]#MyPassword*& then val.add("[email protected]#MyPassword*&");
    ProcessBuilder builder = new ProcessBuilder(val);
    File logFile = new File("LogFile.txt");
    System.out.println("BCP command :" + builder.command());
    builder.redirectlogFile(logFile);
    builder.directory(dir);
    Process exec = builder.start();
    System.out.println("BCP process completed : with errors :" + exec.waitFor());
    System.out.println("BCP logFile :" + org.​apache.​commons.​io.FileUtils.readFileToString(logFile));

Я получил следующую ошибку:

Команда BCP: [bcp, "выберите * из DataBase.schema.TABLE_NAME", queryout, tableData.csv, -c, -t,, -S, 10.0.0.1, -U, TestA, -P,! @# MyPassword * &]

Процесс BCP завершен: с ошибками: 1

BCP logFile: запуск копии... SQLState = S1000, NativeError = 0 Ошибка = [Microsoft] [Собственный клиент SQL Server 11.0] Невозможно разрешить сортировки на уровне столбца

SQLState = 37000, NativeError = 102 Ошибка = [Microsoft] [SQL Server Native Client 11.0] [SQL Server] Неверный синтаксис рядом с 'select * from DataBase.schema.TABLE_NAME".

Посмотрев на ошибку, я проверил сопоставления Server, Database и Table, все кажется похожим SQL_Latin1_General_CP1_CI_AS

Технические характеристики системы:

Linux :
    uname -mrs
        Linux 3.10.0-327.10.1.el7.x86_64 x86_64
    uname -a
        Linux [domain] 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    cat /etc/redhat-release
        CentOS Linux release 7.2.1511 (Core)

ODBC Driver for linux:
    isql --version
        unixODBC 2.3.0

    odbcinst -q -d -n "SQL Server Native Client 11.0"
        [SQL Server Native Client 11.0]
        Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
        Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0

Кто-нибудь мне поможет Что я делаю неправильно здесь.

Ответ 1

Я попытался создать оболочку script его рабочий штраф.

File dir = new File("Mydirectory"); 
Path dataPath = Paths.get("tableData.csv"); 
SStringBuilder strb = new StringBuilder();
strb.append("bcp ");
strb.append("\"select " + column + "  from " + credentials.getSchema() + ".dbo." + table_name + "\" ");
strb.append("queryout ");
strb.append(dataPath.toString());
strb.append(" -c ");
strb.append("-t ");
strb.append(", ");
strb.append("-S ");
strb.append(credentials.getServer());
strb.append(" -U ");
strb.append(credentials.getUser());
strb.append(" -P ");
strb.append(credentials.getPassword());

File shellFile = new File(folderName + File.separator + "exec.sh");

try (FileOutputStream outShell = new FileOutputStream(shellFile)) {
    outShell.write(strb.toString().getBytes());
    outShell.flush();
}
shellFile.setExecutable(true, false);
shellFile.setWritable(true, false);
shellFile.setReadable(true, false);
builder = new ProcessBuilder(shellFile.getAbsolutePath());

File logFile = new File("LogFile.txt");
System.out.println("BCP command :" + builder.command());
builder.redirectlogFile(logFile); builder.directory(dir); 
Process exec = builder.start();
System.out.println("BCP process completed : with errors :" + exec.waitFor());
System.out.println("BCP logFile :" + org.​apache.​commons.​io.FileUtils.readFileToString(logFile));

Спасибо всем...

Ответ 2

Я хочу поделиться с вами некоторыми предложениями. Возможно, вы попытались. Надеюсь, он решит вашу проблему.

Предложение-1:

Иногда эта проблема возникает, если мы изменяем сортировку столбца или делаем какие-либо изменения свойств таблицы/вида. Одна вещь, которую вы можете сделать, это проверить настройку сортировки столбцов b\w исходной и целевой таблицы, а затем использовать предложение COLLATE в исходном script, чтобы изменить сортировку в соответствии с точкой назначения. Эта проблема может быть решена путем воссоздания таблицы/вида. Поэтому я предлагаю вам снова создать "TABLE_NAME" из вашего "DataBase.schema"

Предложение-2:

Рекомендуемое решение:

Иногда запрос не работает и дает ошибку. В этом случае, если мы используем печать, эта проблема решена. Вы можете пройти через этот раздел: SQL-запрос с использованием bcp, не работающего с queryout как переменной

Предложение-3:

Жесткая задача, но полезная:

Вы можете попытаться удаленно подключиться к серверу и запустить bcp без опции -S из вашего кода. Снимите нижнюю часть и попробуйте:

val.add("-S");
val.add([server]);// ex: if Server is 10.0.0.1  then val.add("10.0.0.1");

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

Предложение-4:

Иногда null и bulk insert также могут вызвать эту проблему. вы можете пройти: Ошибка сортировки объемной вставки

Предложение-5:

Эта проблема возникла в SQL Server 2005 Native Client. Но microsoft не будет исправлять это в предыдущей версии. Они зафиксировали его в SQL Server 2008 Native Client. Более подробную информацию вы можете получить: Ошибка BCP - Невозможно разрешить сортировки столбцов - by krishnc

Ответ 3

Использовать команду freebcp из синтаксиса Linux - все такие же, как BCP.

Ie

bcp mydatabase.dbo.mytable out mytable.csv /U myusername /P mypassword /S myhost /c  

эквивалентно

freebcp mydatabase.dbo.mytable out mytable.csv -U myusername -P mypassword -S myhost -c

Ответ 4

ProcessBuilder не имеет такого же поведения, как CMD, поэтому вам не нужны кавычки:

val.add("select * from " + database_name + ".[Schema]." + table_name);