BCP Utility Impossible d’exporter des données sous Linux en utilisant JAVA:

J’ai essayé d’exécuter le morceau de code suivant pour exporter des données (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 

le code ci-dessus fonctionne correctement dans le terminal .

En revanche, j’ai essayé le même morceau de code en utilisant Java.

 File dir = new File("Mydirectory"); Path dataPath = Paths.get("tableData.csv"); List val = new ArrayList(); val.add("bcp"); val.add("\"select * from " + [Database] + ".[Schema]." + table_name + "\""); val.add("queryout"); val.add(dataPath.toSsortingng()); 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.readFileToSsortingng(logFile)); 

J’ai eu l’erreur suivante:

Commande BCP: [bcp, “select * from DataBase.schema.TABLE_NAME”, queryout, tableData.csv, -c, -t, ,, -S, 10.0.0.1, -U, TestA, -P,! @ # MyPassword * &]

Processus BCP terminé: avec des erreurs: 1

BCP logFile: copie de démarrage … SQLState = S1000, NativeError = 0 Erreur = [Microsoft] [SQL Server Native Client 11.0] Impossible de résoudre les classements de niveau colonne

SQLState = 37000, NativeError = 102 Erreur = [Microsoft] [SQL Server Native Client 11.0] [SQL Server] Syntaxe incorrecte près de ‘select * from DataBase.schema.TABLE_NAME’.

En regardant l’erreur, j’ai vérifié les classements de Server , Database et Table tout semble similaire SQL_Latin1_General_CP1_CI_AS

Spécifications du système:

 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 

Quelqu’un m’aide ce que je fais mal ici.

Je veux partager avec vous quelques suggestions. Vous avez peut-être essayé. J’espère que cela va résoudre votre problème.

Suggestion-1:

Parfois, ce problème se produit si nous modifions le classement de la colonne ou apportons des modifications aux propriétés propres à la table / vue. Une chose que vous pouvez faire est de vérifier le paramètre de classement des colonnes b \ w de la table source et de destination, puis d’utiliser la clause COLLATE dans votre script source pour modifier le classement afin qu’il corresponde à celui de la destination. Ce problème peut être résolu en recréant la table / vue. Je vais donc vous suggérer de créer à nouveau le "TABLE_NAME" partir de votre "DataBase.schema"

Suggestion-2:

Solution recommandée:

Parfois, l’interrogation n’est pas effectuée et donne une erreur. Dans ce cas, si nous utilisons l’impression, ce problème est résolu. Vous pouvez parcourir cette section: Requête SQL utilisant bcp ne fonctionnant pas avec queryout en tant que variable

Suggestion-3:

Tâche difficile mais utile:

Vous pouvez essayer de vous connecter au serveur à distance et exécuter le bcp sans l’option -S de votre code. Retirez la partie ci-dessous et faites un essai :

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

Si le classement du serveur est différent de celui de la firebase database ou de la colonne, essayez de créer le fichier de format et spécifiez-le explicitement dans le bcp.

Suggestion-4:

Parfois, null bulk insert null et en bulk insert peut également causer ce problème. vous pouvez passer par: Bulk Insert Collation Error

Suggestion-5:

Ce problème est survenu dans SQL Server 2005 Native Client . Mais Microsoft ne corrigera pas cela dans la version précédente. Ils l’ont corrigé dans SQL Server 2008 Native Client . Pour plus de détails, vous pouvez passer par: Erreur BCP – Impossible de résoudre les classements au niveau de la colonne – par krishnc

Utiliser la commande freebcp partir de la syntaxe Linux est très similaire à BCP .

C’est à dire

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

est équivalent à

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

ProcessBuilder n’a pas le même comportement que CMD, vous n’avez donc pas besoin de guillemets:

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

J’ai essayé en créant un script shell, cela fonctionne très bien.

 File dir = new File("Mydirectory"); Path dataPath = Paths.get("tableData.csv"); SSsortingngBuilder strb = new SsortingngBuilder(); strb.append("bcp "); strb.append("\"select " + column + " from " + credentials.getSchema() + ".dbo." + table_name + "\" "); strb.append("queryout "); strb.append(dataPath.toSsortingng()); 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.toSsortingng().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.readFileToSsortingng(logFile)); 

Merci à tous…