Утилита 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 !@#MyPassword*& then val.add("!@#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, " select * from DataBase.схема.ИМЯ ТАБЛИЦЫ", queryout, tableData.csv, - c, - t,,, - S, 10.0.0.1, - U, TestA, - P, !@#MyPassword*&]

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

файл журнала BCP: начальная копия... Sqlstate = S1000, NativeError = 0 Ошибка = [Microsoft][SQL Server Native Client 11.0]не удается разрешить параметры сортировки на уровне столбцов

SQLState = 37000, NativeError = 102 ошибка = [Microsoft][SQL Server Собственный клиент 11.0] [SQL Server]неверный синтаксис рядом с " select * from база данных.схема.ИМЯ_ТАБЛИЦЫ'.

глядя на ошибку, я проверил параметры сортировки 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

любой, кто поможет мне, что я делаю неправильно здесь.

4 ответов


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

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

иногда эта проблема возникает, если мы меняем параметры сортировки столбца или вносим изменения в собственные свойства таблицы/представления. одна вещь, которую вы можете сделать, это проверить настройку сортировки столбцов B\w source & destination table, а затем использовать предложение COLLATE в исходном скрипте, чтобы изменить параметры сортировки в соответствии с назначением. этот проблема может быть решена путем воссоздания таблицы/представления. Поэтому я предлагаю вам создать новый "TABLE_NAME" из своего "DataBase.schema"

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

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

иногда queryout не работает и дает ошибку. В этом случае, если мы используем print, то эта проблема решена. Вы можете пройти через этот раздел: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-невозможно разрешить сопоставления уровня столбца-krishnc


использовать 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

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

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

Я попытался создать сценарий оболочки работает нормально.

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

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