Утилита 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));
спасибо всем...