IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[2K5] BULK INSERT / BCP / Unicode / BOM / UTF-16


Sujet :

MS SQL Server

  1. #1
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut [2K5] BULK INSERT / BCP / Unicode / BOM / UTF-16
    Bonjour à tous

    Je m'arrache les cheveux sur un problème que je n'arrive pas à comprendre.

    Avant, j'avais un fichier UTF-16, Big Endian, avec le BOM correct (FE FF au début du fichier) qui s'intégrait parfaitement avec la commande BULK INSERT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BULK INSERT [SYS_IMPORT]
    FROM 'fichier-utf-16-be-BOM-OK'
    WITH (FORMATFILE = 'SYS_IMPORT.fmt',
            ROWS_PER_BATCH = 5000,
            MAXERRORS = 5000,
            CODEPAGE = 'ACP')
    Du jour au lendemain, alors qu'il n'y a pas eu de mise à jour de SQL Server, ni de Windows, elle ne foncionne plus, alors que ça fait 3 ans que la procédure fonctionnait nickel (bien qu'elle n'aurait pas dû... déjà rien que là je m'arrache les cheveux)

    Aujourd'hui, mon BULK INSERT (qui est un peu mieux géré, entre temps j'ai lu la doc ) n'accepte que les fichiers UTF-16, Little Endian, et sans le BOM (sans le FF FE initial) sinon il le considère comme un caractère (et mon fichier est au format colonne fixes, donc sur la première ligne j'ai un caractère de trop)

    (Pour info dans le nom du fichier "BE" ou "LE" signifie "Big Endian" ou "Little Endian")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BULK INSERT SYS_IMPORT
    FROM 'fichier-utf-16-le-BOM-NOK'
    WITH ( FORMATFILE = 'le-meme-que-l-ancien',
          ROWS_PER_BATCH = 5000,
          MAXERRORS = 5000,
          CODEPAGE = 'RAW',
          DATAFILETYPE = 'widenative' )
    Bon jusque là, je peux m'arranger, vu que c'est moi qui convertit via un programme home made le fichier reçu de notre client. Je l'ai donc paramétré pour qu'il me sorte un fichier sans BOM, UTF-16, Little Endian.

    Bon bref, jusque là ça va. Or je dois extraire ce fichier via BCP pour le réintégrer dans une autre table. J'exécute donc la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bcp "SELECT LEFT(DONNES, 600) FROM MA_BASE.dbo.SYS_IMPORT where CODE_INTERFACE = 1" queryout "TBL_AFFAIRE.txt" -w -T -C"RAW" -SSERVEUR
    Et là c'est le drame. J'obtiens un fichier au format UTF-16, Little Endian, avec le BOM... et du coup quand je fais mon BULK INSERT, le BOM fais un caractère de plus, la première ligne fais 1 caractère de trop, l'import échoue, et je suis bloqué pour la suite.

    J'ai essayé les différents formats de fichiers (options -c -n -w -6)
    -c ne me convient pas, j'ai besoin de gérer des fichiers internationnaux, entre autres russe, grecs et turcs qui sont dans des jeux de caractères différents, d'où l'utilisation de l'unicode
    -n ne s'importe pas avec ma commande BULK INSERT comme au dessus (il y a peut être quelque chose que j'ai oublié de modifier, mais j'ai pas trouvé)
    -6 n'a pas d'intérêt, vu que je pars d'une base de données 2K5 et que j'arrive dans une base de données 2K5
    -w me met le BOM FF FE en début de fichier

    Je cherche donc l'une des solutions suivante :
    - Arriver à intégrer un fichier via un BULK INSERT avec SQL Server qui prends en compte mon BOM (et qu'il gère le Big Endian serait un gros plus, j'aurais pas besoin de refaire X configurations sur le serveur de prod)
    - faire que BCP me sorte un fichier en UTF-16, Little Endian, sans BOM

    Dans les 2 cas, après je vais pouvoir recommencer l'import de mon fichier comme il faut. Et je verrai plus tard pour faire un truc plus propre qui n'a pas besoin de faire des imports=>extraction=>réimport pour importer mon fichier de données. Pour le moment, il est plus urgent pour moi de refaire fonctionner l'existant, l'optimisation sera pour plus tard.

  2. #2
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut
    Bon en attendant mieux, j'ai triché

    Lors de mon BCP, j'ai rajouté une ligne vide
    Le SELECT du BCP est maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT '' UNION SELECT LEFT........
    Du coup, lors du BULK INSERT, je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BULK INSERT TBL_AFFAIRE
    	                  FROM 'fichier-issu-de-bcp'
    	                  WITH ( FORMATFILE = 'format-du-fichier-modifie-pour-LE-sans-BOM',
    	                         ROWS_PER_BATCH = 5000,
    	                         MAXERRORS = 5000,
    	                         CODEPAGE = 'RAW',
    	                         DATAFILETYPE = 'widenative',
    	                         FIRSTROW = 2 )
    et ça passe...

    Bon demain j'ai plus qu'à réécrire tout le reste et je devrais pouvoir réintégrer mes fichiers correctement

  3. #3
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut
    Et bien non, ça ne fonctionne pas, les fichiers "vides" (contenant une ligne une fois mon BCP terminé) ne s'intègrent pas. J'en peux plus de ces fichiers Unicode :'(

  4. #4
    Membre habitué Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 367
    Points : 191
    Points
    191
    Par défaut
    Nouvelle solution issue de mon cerveau fertile et retourné par la conception de cet import de fichier :

    Avant le BCP, je vérifie le nombre de lignes qu'il va y avoir dans mon export (je fais un "SELECT @rc = COUNT(*) FROM ...." qui va contenir mon jeu d'extraction) et si @rc = 0, au lieu d'effectuer mon BCP,je fais un "title > fichier-de-destination" pour créer un fichier vide

    Du coup, lors de l'import, comme le fichier est vide je n'ai plus d'erreur.

    Ca commence à faire beaucoup de contournement pour pas grand chose tout ça. Je crois que je ferais mieux de trouver un moyen de faire un BULK INSERT depuis une table au lieu d'exporter une partie de ma table, puis de la réimporter

Discussions similaires

  1. Export BCP / Import BULK INSERT :
    Par nsjnsj dans le forum Administration
    Réponses: 4
    Dernier message: 19/11/2010, 18h08
  2. Différence BCP / BULK INSERT
    Par ac/dc dans le forum Outils
    Réponses: 12
    Dernier message: 08/10/2010, 16h23
  3. Réponses: 1
    Dernier message: 23/02/2009, 13h31
  4. SQL 2k5 - Bulk Insert et contrainte identity
    Par Luc1an0 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 08/01/2008, 19h35
  5. Réponses: 2
    Dernier message: 21/03/2007, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo