11
votes

Obtenir bcp.exe pour échapper à des terminateurs

J'ai besoin d'exporter certaines données à l'aide de l'utilitaire BCP de SQL Server 2000. Parfois, mes données contiennent des caractères, tels que \ T et \ N, que je dois utiliser comme terminateurs de colonne et de lignes. Comment puis-je obtenir BCP pour échapper aux caractères qu'il utilise en tant que terminateurs, car il génère les données, de sorte que je puisse réellement importer les données dans un autre programme?

Par exemple, une de mes colonnes est des données de texte et comprend des onglets et des lignes neuves. Le BCP les exporte simplement comme étant, et le programme que j'essaie d'importer avec confondu car les données se termine au milieu d'une ligne et / ou d'une ligne contiennent des colonnes supplémentaires pour aucune raison apparente.

Cela ressemble à une fonction très, très, à inclure dans un exportateur de données, mais aucune de Les options de ligne de commande semblent en mentionner. (Pourquoi ce ne serait pas simplement la valeur par défaut qui me dépasse.) Est-ce que je manque quelque chose?


0 commentaires

4 Réponses :


-9
votes

Vous ne pouvez pas avoir de données contenant des onglets et de nouvelles lignes neuves avec des onglets et des séparateurs de Newline. Cela n'a aucun sens. S'échapper ne vous aiderait pas, car un onglet est un onglet. Nous ne parlons pas de la manipulation des chaînes C # ici.

Ce que je ferais est d'utiliser Différents terminateurs < / a> tel que | et || / n ou utilisez un Fichier de format


7 commentaires

En fait, cela a du sens - par exemple, en utilisant la copie de PostgreSQL, il allumera la séquence \ n dans une nouvelle ligne réelle dans une colonne de texte. Et malheureusement, je ne peux pas spécifier un délimiteur de ligne dans PostgreSQL.


De plus, bien que différents terminateurs soient une solution de contournement, il s'agit d'un vraiment longtemps pour effectuer les remplacements post-requête. Ce serait beaucoup mieux si BCP pouvait simplement échapper correctement aux colonnes de texte.


Ni OSQL ni SQLCMD ne l'appuient non plus. Et si vous aviez un champ se terminant par le caractère d'échappement, par exemple? Et si vous lisez l'info PostgreSQL, il mentionne à propos de Dodgy ESPAPING ... SQL Server est totalement prévisible, non?


Eh bien, il faudrait aussi échapper aux personnages d'évacuation. C'est à quel point les personnages d'évasion fonctionnent. Un champ de texte contenant une rupture de ligne, une barre oblique inverse et une onglet sortirait sous forme \ n \\\ t et retourne en une ligne arrière, et une onglet à l'importation. Pourriez-vous fournir une référence pour que DoDgy s'échappe? Je n'ai rien vu à Postgresql.org/docs/8.4/statique /sql-copy.html . SQL Server est prévisible, sûr, mais pas la sortie que je suis (ou pgsql est) à la recherche.


Dans votre lien: "... Méfiez-vous d'ajouter inutilement les backslashes, car cela pourrait produire accidentellement une chaîne correspondant au marqueur de fin de données ..." + 3 notes sur le mode CSV. Sybase, identique à SQL Server: Manuels. sybase.com/onlinebooks/group-as/asg1250e/util/...


Mot clé étant "inutilement". Si vous lisez le paragraphe suivant: "Il est fortement recommandé que les applications générant des données de copie convertissent des nouvelles de données et des retours de chariot sur les séquences \ n et \ r respectivement." Ce qui est exactement ce que j'essaie d'obtenir le BCP à faire.


Quoi qu'il en soit, j'ai répertorié les options communes tout en utilisant SQL Server (ou Sybase) afin que ce soit à vous de choisir ...



-2
votes

J'ai le même problème et cherché longtemps pour trouver une solution. J'ai trouvé celui-ci d'un maître de BCP et il semble raisonnable. Peut-être que vous voulez essayer aussi.

Solution possible: http: // groupes. google.co.uk/group/microsoft.public.sqlserver.tools/tree/browse_frm/thread/f1ee12cba3079189/ef9094123901fe26?rnum=1&q=lindawie+format+file&_done=%2Fgroup%2Fmicrosoft.public.sqlserver.tools%2Fbrowse_frm%2Fthread % 2Ff1ee12cba3079189% 2Fef9094123901fe26% 3Ftvc% 3D1% 26Q% 3Dlindawie% 2Bformat% 2Bfile% 26 # doc_fa5708ca51d967a6

Détails du fichier Format et conception: http://msdn.microsoft.com/en-us /library/aa173859%28SQL.80%29.aspx

En général, je peux suggérer ces liens pour vous aider à connaître des problèmes de BCP et des solutions: http://groups.google.co.uk/groups?q=lindawie + Format + fichier

Cordialement


1 commentaires

Liens brisés et détails de la solution non décrite en réponse



10
votes

Totalement d'accord avec vous: l'échappement devrait être une option. "Vous ne pouvez pas avoir de données avec des onglets ou des lignes neuves" est la chose la plus fraîche que j'ai jamais entendue.

Voici une solution possible:

  1. Utilisez l'option -R pour définir un terminateur de ligne différent. Quelque chose de
    Peu susceptible d'être présent dans vos données (#! # $ #% # #). Je pense que vous pouvez utiliser plusieurs
    caractères, donc cela facilite la tâche.
  2. Ouvrez votre fichier de données dans SED, un éditeur de texte capable ou écrire un script - et remplacer le caractère \ n et \ t avec leurs équivalents échappés (\\ n et \\ t). Enfin, remplacez votre terminateur de ligne avec \ N et vous devriez être bon.
  3. Je pense que la même chose devrait s'appliquer à l'utilisation de Terminators sur le terrain

    Jetez un coup d'œil à Cet article pour plus d'informations .


0 commentaires

5
votes

Vous pouvez utiliser un séparateur composé de plusieurs caractères si vous les mettez entre des guillemets doubles:

bcp my_table out c: \ my_file.txt -sser_ip -d db_name -u my_user -p my_password -w -t "& #) ^ @" -r "> ~ +!"

a trouvé la solution ici .


0 commentaires