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

Développement SQL Server Discussion :

BULK INSERT : définition du séparateur décimal


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 161
    Par défaut BULK INSERT : définition du séparateur décimal
    Bonjour,

    Voici mon code qui me sert à importer des fichiers texte :
    J' efface la table si elle existe déjà
    Je crée la structure de la table, et
    j' utilise bulk insert pour importer les données.

    Cela marche bien sur 10 fichiers, sauf sur 2 qui contiennent des valeurs décimales. Or mon spérateur décimal,dans le fichier texte, est la virgule et non le point.

    Dans le code ci joint, c'est la variable PX_ACH, qui posent problème.

    Comment forcer la virgule comme séparateur décimal ?
    Sinon, y a til un moyen pour remplacer les virgules par un point dans le champ PX_ACH, ce qui me permettrait de faire un ALTER TABLE ... ALTER COLUMN ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    use SOCLEFEJ
     
    DECLARE @dossier varchar (70) ,@fichier varchar(50), @tble_so varchar(30),
    @commande varchar(300),@com_drop varchar(50), @com_cr varchar(5000);
     
    set @dossier='\\fqx23052\XXX\YYY\';
    set @fichier ='1MSBI_OUT_ligne_vente_20100222.txt';
    set @tble_so='VENTE_LIGNE';
     
    IF EXISTS (SELECT TABLE_NAME a FROM INFORMATION_SCHEMA.TABLES
            WHERE TABLE_NAME =  @tble_so 
            and table_schema='recette')
        set @com_drop='DROP TABLE recette.'+@tble_so;
        execute(@com_drop);
     
    set @com_cr='create table soclefej.recette.'+@tble_so+'
    (
    NO_TICKET VARCHAR(50) NULL,
    ID_VEND VARCHAR(50) NULL,
    ID_ARTICLE VARCHAR(50) NULL,
    COD_BAR VARCHAR(50) NULL,
    COD_TRAITEMENT VARCHAR(50) NULL,
    QTECDE VARCHAR(50) NULL,
    NB_UNI VARCHAR(50) NULL,
    ID_MOT_RET varchar(50) NULL,
    PX_ACH NUMERIC(18,4) NULL
    )ON [PRIMARY]';
     
    execute(@com_cr)
     
    set @commande='BULK INSERT soclefej.recette.'+@tble_so+' from '+''''+@dossier+@fichier+''''+' WITH (  
             FIELDTERMINATOR ='''+'\t'+''' , ROWTERMINATOR ='+'''\n'''+' , firstrow=2 );';
    execute(@commande)

    Merci de votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    A la place d'une recréation de table, faites plutôt un TRUNCATE TABLE

    Concernant votre problème de virgule, mettez votre colonne PX_ACH au type VARCHAR(18).

    Créez ensuite une colonne calculée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE maTable
    ADD maColonne AS (CAST(PX_ACH AS NUMERIC(18, 4)))
    Créez enfin une vue sur votre table, de façon à pouvoir procéder au BULK INSERT( puor lequel vous ne pouvez pas spécifier les colonnes dans lesquelles vous réalisez l'import) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE VIEW soclefej.recette.maVue
    AS
    SELECT  NO_TICKET,
    	ID_VEND,
    	ID_ARTICLE,
    	COD_BAR,
    	COD_TRAITEMENT,
    	QTECDE,
    	NB_UNI,
    	ID_MOT_RET,
    	PX_ACH
    FROM soclefej.recette.maTable
    et faites le BULK INSERT sur la vue (et plus sur la table)

    Vous pouvez faire l'inverse, c'est à dire :
    - continuer à faire le BULK INSERT sur votre table sans y ajouter la colonne calculée mais en modifiant le type de la colonne PX_ACH,
    - créer une vue sur cette table sans la colonne PX_ACH mais avec la CAST que je vous ai proposé
    - SELECT mesColonnes FROM maVue

    @++

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 161
    Par défaut
    Bonjour,

    Merci bien pour la piste, mais ce code ne fonctionne pas :

    Il me met l'erreur :
    Erreur de conversion du type de données varchar en numeric.
    et ma table s'est vidée après l'alter table.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Recherchez pour quelles valeurs cela ne fonctionne pas

    C'est le TRUNCATE TABLE qui vous a vidé la table, par le ALTER.
    Donnez votre code complet, que nous y voyions plus clair !

    @++

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 161
    Par défaut
    Le problème est résolu.
    Pour passeer en numérique une chaine de type 25,48, j'utilise la fonction remplace pour remplacer la virgule par un point.
    La chaine 25.48 peut alors être converti en float!

    Merci elsuket

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Message d'erreur avec Bulk Insert
    Par Shivas dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 18/07/2005, 12h03
  2. [CR8.5][Oracle8] Séparateur décimal ignoré
    Par chrilie73 dans le forum SAP Crystal Reports
    Réponses: 9
    Dernier message: 06/06/2005, 18h31
  3. Comment préciser nom de la colonne pour un Bulk Insert
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/06/2004, 17h05
  4. BULK INSERT
    Par jeremie dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 12/03/2004, 13h49
  5. Bulk insert et caractère accentué
    Par slc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/04/2003, 12h52

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