Problème de terminaison de champ dans les fichiers de format

Jai un fichier de données au format txt et je le chargeais avec Bulk Insert dans la commande suivante:

Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", ) 

Le code fonctionne bien. Cependant, alors que jessayais dutiliser un fichier de format avec linsertion en bloc pour charger le fichier, jai rencontré des problèmes pour spécifier le terminateur de champ pour la dernière ligne.

Voici la spécification de la dernière ligne dans le format de fichier:

21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS 

Avec « 0x0a » comme terminateur, jobtiens lerreur suivante:

Erreur de conversion des données de chargement en bloc (troncature) pour la ligne 2, colonne 1 (var1).

Avec « \ n », les données peuvent être chargé, mais « | » est également chargé dans la dernière colonne. Par exemple, jobtiens « 0.5 | » au lieu de « 0.5 ».

« | \ n », « 0x0a », « | 0x0a », « \ r \ n » renvoie la même erreur que « | »

Erreur de conversion des données de chargement en bloc (troncature) pour la ligne 2, colonne 1 (var1).

I  » m en utilisant sql-server 2016, windows 10 64bit.

Quelquun peut-il vous aider? Merci davance pour votre aide!

Jason

Commentaires

  • Puisque vous ' avez posé quelques questions à ce sujet maintenant, jetez un œil à cette page: sommarskog.se/bulkload.html
  • @sp_BlitzErik, merci pour votre réponse! Cet article est très utile et fournit beaucoup plus dinformations que le site MSDN. En lisant lexemple sous 4.1 , Je me suis confondu avec le terminateur de champ " \ " \ r \ n ", la citation est la note vraiment complète, est-ce un type?
  • Si je me souviens bien, cest ' une séquence déchappement. Si vous gardez rea Ding là ' une meilleure explication plus bas.

Réponse

Après une journée entière à lutter avec le code Line Feed / Hex, jai finalement trouvé que mon problème était causé par des colonnes manquantes dans les fichiers de format. Lensemble de données est nouveau pour moi et je pensais quil avait 21 lignes alors quil en a en fait 22. Cest pourquoi le serveur sql a continué à charger le dernier « | » à partir du fichier de données.

Voici une référence pour les autres peut-être intéressés par le chargement du fichier de données depuis le système UNIX avec des terminateurs de ligne différents de Windows, il y en a trois méthodes:

  1. utiliser linsertion en bloc et définir le terminateur de ligne sur « 0x0a ».
  2. utiliser un fichier de format et définir le terminateur de champ du dernier champ comme « \ n « .
  3. Utilisez un SQL dynamique avec la fonction Char (10) pour insérer le saut de ligne (LF) dans la chaîne de commande, puis exécutez () la chaîne de commande.

Avant dessayer ces méthodes, utilisez un bloc-notes pour afficher tous les caractères de contrôle afin de confirmer les caractères de contrôle utilisés par les fichiers texte.

Si aucune de ces méthodes ne fonctionne pour vous, vous pouvez avoir des problèmes autres que la ligne terminateur de flux / ligne.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *