Утилита 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);