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 :

Bulk via utilitaire bcp - fichier vers table - problème insertion des valeurs NULL dans des varchar nullable


Sujet :

MS SQL Server

  1. #1
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut Bulk via utilitaire bcp - fichier vers table - problème insertion des valeurs NULL dans des varchar nullable
    Bonjour,

    J'utilise l'utilitaire bcp de SQL Server pour importer des données d'un fichier vers une table de ma base de données.

    Mon problème est le suivant :
    Dans ma table, j'ai certaines colonnes qui sont varchar(x), nullables.
    Je voudrais insérer NULL dans ces colonnes quand je n'ai pas de donnée correspondante dans mon fichier.

    Voici ma commande bcp :
    Code cmd : Sélectionner tout - Visualiser dans une fenêtre à part
    bcp MYDATABASE.dbo.CountryTable in "D:\010.dat" -T -f my_format_file_010.xml -S FRDTOSIS165 -b 1000000 -k

    Voici le fichier de format que j'utilise :

    Code xml : 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
    35
    <?xml version="1.0"?>
    <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <RECORD>
      <FIELD ID="1" xsi:type="CharFixed"  LENGTH="22" COLLATION="French_CS_AS"/>
      <FIELD ID="2" xsi:type="CharFixed"  LENGTH="4"/>
      <FIELD ID="3" xsi:type="CharFixed"  LENGTH="3"/>
      <FIELD ID="4" xsi:type="CharFixed"  LENGTH="3" COLLATION="French_CS_AS"/>
      <FIELD ID="5" xsi:type="CharFixed"  LENGTH="9"/>
      <FIELD ID="6" xsi:type="CharFixed"  LENGTH="1" COLLATION="French_CS_AS"/>
      <FIELD ID="7" xsi:type="CharFixed"  LENGTH="3"/>
      <FIELD ID="8" xsi:type="CharFixed"  LENGTH="3" COLLATION="French_CS_AS"/>
      <FIELD ID="9" xsi:type="CharFixed"  LENGTH="9"/>
      <FIELD ID="10" xsi:type="CharFixed" LENGTH="5" COLLATION="French_CS_AS"/>
      <FIELD ID="11" xsi:type="CharFixed" LENGTH="1"/>
      <FIELD ID="12" xsi:type="CharFixed" LENGTH="2" COLLATION="French_CS_AS"/>
      <FIELD ID="13" xsi:type="CharFixed" LENGTH="3" COLLATION="French_CS_AS"/>
      <FIELD ID="14" xsi:type="CharTerm" TERMINATOR="\r\n" LENGTH="3"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="col1" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="2" NAME="col2" xsi:type="SQLSMALLINT"/>
      <COLUMN SOURCE="3" NAME="col3" xsi:type="SQLSMALLINT"/>
      <COLUMN SOURCE="4" NAME="col4" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="5" NAME="col5" xsi:type="SQLINT"/>
      <COLUMN SOURCE="6" NAME="col6" xsi:type="SQLCHAR"/>
      <COLUMN SOURCE="7" NAME="col7" xsi:type="SQLSMALLINT"/>
      <COLUMN SOURCE="8" NAME="col8" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="9" NAME="col9" xsi:type="SQLINT"/>
      <COLUMN SOURCE="10" NAME="col10" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="11" NAME="col11" xsi:type="SQLBIT"/>
      <COLUMN SOURCE="12" NAME="col12" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="13" NAME="col13" xsi:type="SQLVARYCHAR" />
      <COLUMN SOURCE="14" NAME="col14" xsi:type="SQLSMALLINT"/>
     </ROW>
    </BCPFORMAT>

    Voici les données dans mon fichier :
    (Capture d'écran Notepad++ pour se rendre compte des espaces, caractères spéciaux, caractères de fin de ligne etc..)


    Mon fichier de données ne contient pas de séparateur.
    Une ligne contient 14 champs.
    Chaque champ est défini sur un nombre fixe de caractères.


    Pour se rendre compte de mon problème, prenons l'exemple de "col13" :


    Le champ "col13" est nullable. Pour ce champ, dans le fichier, pour une valeur NULL, on laisse ce champ vide.
    (exemple : sur ma capture d'écran, voir la 3ème ligne du fichier, j'ai surligné le champ col13 en gris)
    Ce champ correspond à une colonne de type varchar(3), NULL dans ma table.

    Après la commande bcp, dans ma base de donnée, je voudrais que pour la ligne 3, il y ait la valeur NULL.
    Actuellement, il y a une chaîne vide de length= 0.

    Note n°1 : pour les champs NULL qui ne sont pas de type varchar, comme par exemple des smallint nullable, les valeurs NULL sont bien insérées.
    Note n°2 : Dans SQL Server, pour ma table, si je met une valeur par défaut, cette valeur par défaut pour col13 n'est jamais insérée après ma commande bcp. C'est toujours la chaîne vide de length = 0.
    Note n°3 : Notez que j'utilise bien le paramètre -k dans ma commande bcp. http://msdn.microsoft.com/en-us/libr...ql.100%29.aspx



    Comment faire pour insérer des valeur NULL pour des champs de type varchar nullable ?

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    As-tu essayer de mettre l'attribut NULLABLE = "YES" pour la colonne concernée dans ton fichier format :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    <COLUMN SOURCE="13" NAME="col13" xsi:type="SQLVARYCHAR" NULLABLE ="Yes" />
    ...
    ++

  3. #3
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut
    Oui, j'ai ajouté NULLABLE="YES".
    Ça ne fonctionne pas, car en lisant la documentation,
    http://msdn.microsoft.com/en-us/libr...#HowUsesColumn, je vois notamment cette citation
    How Bulk Import Uses the <ROW> Element
    The <ROW> element is ignored in some contexts. Whether the <ROW> element affects a bulk-import operation depends on how the operation is performed:
    the bcp command
    When data is loaded into a target table, bcp ignores the <ROW> component. Instead, bcp loads the data based on the column types of the target table.
    qui me dit que lors d'une commande bcp, toute la partie <ROW> dans le fichier de format est ignorée.

  4. #4
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut
    En recherchant sur le net, j'ai trouvé ce lien : http://support.microsoft.com/kb/98620/en-us
    Je pense qu'il n'y a pas moyen de faire ce que je veux, en utilisant des fichiers avec des champs de longueur fixe. A part faire un post-traitement pour mettre à jour les colonnes concernées à NULL après la commande bcp.

    Une idée pour la requête de post-traitement ?
    Ce serait la requête qui, pour toutes les tables de ma base donnée, update toutes les colonnes nullables qui ont comme valeur une chaîne vide avec la valeur NULL.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/07/2013, 14h27
  2. [Elementum] Insertion de valeurs nulles dans une colonne numérique d'un table
    Par cquilgars dans le forum Autres outils décisionnels
    Réponses: 2
    Dernier message: 17/07/2012, 12h50
  3. Problème pour mettre valeur NULL dans datarows
    Par b3rman dans le forum ASP.NET
    Réponses: 5
    Dernier message: 17/06/2009, 15h52
  4. Réponses: 1
    Dernier message: 19/08/2006, 03h02
  5. Fichier vers table
    Par claralavraie dans le forum Oracle
    Réponses: 5
    Dernier message: 30/12/2005, 15h25

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