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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    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
    Points : 12 371
    Points
    12 371
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    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
    Points : 12 371
    Points
    12 371
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    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

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 858
    Points : 52 999
    Points
    52 999
    Billets dans le blog
    6
    Par défaut
    1) VARCHAR n'est pas un type SQL. Sans la dimension VARCHAR vaut 1. Vous devez préciser la dimension du VARCHAR. Par exemple VARCHAR(64).

    2) dans ce cas il faut mettre [1] je crois en fin du path

    3) vous gagnerez en perf en utilisant sp_xml_preparedocument.

    A +

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Merci pour la réponse pour les varchar et cela a résolu mon premier problème.

    Mais j'ai toujours un problème si mon fichier contient plus d'un enregistrement bank (correspondant à une ligne dans ma table) alors j'ai une erreur (voir ci-dessous)

    Msg 9448, Level 16, State 1, Line 2
    Analyse XML*: ligne 1, caractère 762, contrôle correct*: entité non déclarée
    Mais si j'ai uniquement un seul enregistrement tout se passe bien.

    Dois je faire une boucle pour traiter tout le fichier?

    Merci

    David

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Merci a tous j'ai trouvé mon erreur dans le fichier d'import j'avais des erreurs.

    David

+ 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