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 :

Import fichier XML dans table Transact SQL


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Par défaut Import fichier XML dans table Transact SQL
    Bonjour,

    Je suis à la recherche de code qui va permette d'importer un fichier dans une table.

    Je connais le fonction bulk insert pour les fichiers texte; mais j'essaye maintenant de faire la même chose avec un fichier XML; et cela ne fonctionne pas

    J'ai commencé par le code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into test(col1 ,col2 ,col3 ,col4 ,col5 ,col5 )
     select * from OPENROWSET(BULK 'C:\Projects\test.xml', SINGLE_BLOB) as X
    Mais lorsque je lance la commande j'ai une erreur
    La liste de sélection de l'instruction INSERT contient moins d'éléments que la liste d'insertion. Le nombre de valeurs de SELECT doit être le même que le nombre de colonnes de INSERT.
    Et dans mon fichier l'on a
    <?xml version="1.0" encoding="UTF-8" ?><DATAROOT><BANK><col1>Test1</col2><col2>Test2</col2><col3>Test3</col3><col4>Test4</col4><col5>TEst5</col5><col6>2008-01-28</col6></BANK></DATAROOT>
    Merci par avance de votre aide.

    David

  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 : 43
    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,

    Il y a 6 colonnes dans votre ordre INSERT, mais la commande OPENROWSET BULK ne renvoie toujours qu'une seule colonne, d'où votre erreur.

    Vous devriez plutôt stocker votre document XML dans une variable de type XML, puis extraire les valeurs avec les méthodes XML .nodes(), .value() et .query().

    Le paramètre qui convient alors pour OPENROWSET BULK devrait plutôt être SINGLE_CLOB

    @++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Par défaut
    Merci pour ta réponse mais aurais tu un exemple car j'ai du mal à voir comment le mettre en place.

    Merci

    David

  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 : 43
    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
    Par exemple :

    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
    DECLARE @monDocument XML
    SELECT @monDocument = BulkColumn
    FROM OPENROWSET(BULK 'C:\Projects\test.xml', SINGLE_CLOB) AS X
     
    INSERT INTO dbo.test
    (
    	col1,
    	col2,
    	col3,
    	col4,
    	col5,
    	col6
    )
    SELECT colonne.value(val1),
    		colonne.value('./val2[1]', 'TypeDeDonnes'),
    		colonne.value('./val3[1]', 'TypeDeDonnes'),
    		colonne.value('./val4[1]', 'TypeDeDonnes'),
    		colonne.value('./val5[1]', 'TypeDeDonnes'),
    		colonne.value('./val6[1]', 'TypeDeDonnes')
    FROM @monDocument.nodes('/cheminDesValeurs') TMP_XML (colonne)
    Regardez d'abord ce que vous ramène @monDocument.nodes('/cheminDesValeurs').

    Utilisez XMLNotePad pour vous aider

    @++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Par défaut
    Merci beaucoup pour ton exemple

    J'ai essayé de l'adapter mais j'ai encore des petits soucis par rapport à mon exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @monDocument XML
    SELECT @monDocument = BulkColumn
    FROM OPENROWSET(BULK ''C:\Projects\test.xml'', SINGLE_CLOB) AS X
    SELECT colonne.value('./col1[1]', 'varchar'),
    		colonne.value('./col2[1]', 'varchar'),
    		colonne.value('./col3[1]', 'varchar'),
    		colonne.value('./col4[1]', 'varchar'),
    		colonne.value('./col5[1]', 'varchar'),
    		colonne.value('./col6[1]', 'varchar')
    FROM @monDocument.nodes('/DATAROOT/BANK') TMP_XML (colonne)

    Mais cela me retourne

    Msg 9448, Level 16, State 1, Line 2
    Analyse XML*: ligne 1, caractère 762, contrôle correct*: entité non déclarée
    David

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Par défaut
    J'ai pu corrigé quelques erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE @monDocument XML;
    SELECT @monDocument = BulkColumn
    FROM OPENROWSET(BULK 'C:\test.xml', SINGLE_CLOB) AS X
    --INSERT INTO dbo.EPC(Country ,BankName ,Address ,City ,BIC ,ReadinessDate )
    SELECT colonne.value('./Col1[1]', 'varchar'),
    		colonne.value('./Col2[1]', 'varchar'),
    		colonne.value('./Col3[1]', 'varchar'),
    		colonne.value('./Col4[1]', 'varchar'),
    		colonne.value('./Col5[1]', 'varchar'),
    		colonne.value('./Col6[1]', 'varchar')
    FROM @monDocument.nodes('/DATAROOT/BANK') TMP_XML (colonne)
    Mais j'ai deux problème:
    - Pour chaque champs il me retourne que la premiere lettre
    - Si dans mon fichier j'ai plus qu'un groupe bank (voir exemple ci-dessous) j'ai l'erreur ci-dessous

    <?xml version="1.0" encoding="UTF-8" ?><DATAROOT><BANK><col1>Test1</col1><col2>Test2</col2><col3>Test3</col3><col4>Test4</col4><col5>TEst5</col5><col6>2008-01-28</col6></BANK><BANK><col1>Test11</col1><col2>Test12</col2><col3>Test13</col3><col4>Test14</col4><col5>TEst15</col5><col16>2008-01-28</col6></BANK></DATAROOT>
    Msg 9448, Level 16, State 1, Line 2
    Analyse XML*: ligne 1, caractère 762, contrôle correct*: entité non déclarée

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

Discussions similaires

  1. Importation fichier txt dans table SQL server
    Par vito30620 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/09/2013, 07h41
  2. [SSIS] [2K8] importer fichier xml dans une table
    Par Tankian dans le forum SSIS
    Réponses: 1
    Dernier message: 15/04/2009, 12h34
  3. import fichier XML dans une table oracle 10g
    Par aijedelachance dans le forum Import/Export
    Réponses: 0
    Dernier message: 08/02/2009, 21h52
  4. Importation fichier Excel dans table Access
    Par kemasse dans le forum Access
    Réponses: 2
    Dernier message: 27/06/2006, 15h12
  5. import fichier texte dans table contrainte
    Par philippe281281 dans le forum Outils
    Réponses: 5
    Dernier message: 14/06/2006, 17h01

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