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
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.
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"
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
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.
Parfois, null
bulk insert
null
et en bulk insert
peut également causer ce problème. vous pouvez passer par: Bulk Insert Collation Error
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…