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 :

Champ BLOB vers fichier XML


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Analyste applicatif
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste applicatif

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Champ BLOB vers fichier XML
    * Bonjour, *

    Avec l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO testblob SELECT 'TestOrders',BulkColumn FROM OPENROWSET(Bulk 'C:\orders.xml', SINGLE_BLOB) AS BLOB
    on charge un fichier XML dans un champ de type BLOB d'une table.
    Quelle est l'instruction qui permet de réaliser l'opération inverse ?
    Je dois au départ d'une table générer plusieurs fichiers XML, ils sont dans des champs de type BLOB de cette table.
    Il semble qu'il est possible d'y arriver avec la commande BCP (http://msdn.microsoft.com/fr-fr/libr...2(SQL.90).aspx) mais tous mes essais sont des échecs. Quelqu'un a-t-il une doc complète à propos de cette commande avec des exemples ?
    Merci

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

    Essayez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT	INTO dbo.testblob 
    SELECT	'TestOrders'
    	, CAST(BulkColumn AS xml)
    FROM	OPENROWSET(BULK 'C:\orders.dat', SINGLE_CLOB) AS CLOB
    Cela dit il vaudrait mieux faire ceci côté applicatif

    @++

  3. #3
    Candidat au Club
    Homme Profil pro
    Analyste applicatif
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste applicatif

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Personne ne connait la commande BCP ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    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 847
    Points : 52 961
    Points
    52 961
    Billets dans le blog
    6
    Par défaut
    Donnez un exemple de ce que vous voulez faire...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Candidat au Club
    Homme Profil pro
    Analyste applicatif
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste applicatif

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Database : TEST
    Table : TESTBLOB
    Colonnes :
    INDICATIF char(10)
    FBLOB varbinary(max)
    Description du contenu des colonnes :
    INDICATIF = Type d'application
    FBLOB contient un fichier XML se rapportant à l'application

    Je dois descendre sur le disque d'un pc sur le réseau le fichier XML pour qu'il soit traité par une autre application.
    J'aimerais le faire via une commande .bat
    D'où mon intérêt à la commande BCP. Mais je n'y arrive pas. Quelle est la syntaxe correcte ?

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Le contexte n'est pas très précis, mais j'ai l'impression que bcp n'est pas forcément ce qu'il vous faut...

    Tel que vous présentez les choses, j'imagine que vous ne voudrez récupérer le contenu XML que d'une ligne particulière dans votre table ???
    (je n'ai pas compris le but de la colonne INDICATIF)

    je suppose que l'application ne peut etre modifiée ? (sinon idéalement, elle pourrait récupérer le contenu XML avec une simple requête en base)

    Personnellement, pour répondre au besoin initial, je ferais un script (par exemple en powershell) qui tournerait sur la machine cible (votre pc sur le réseau), se connecterait à la BDD pour récupérer les données et les écrirait dans un fichier...

    car j'imagine aussi que vous allez devoir soit effacer, soit flagguer les données qui ont été exportées ? sinon vous allez les réexporter à chaque fois...

  7. #7
    Candidat au Club
    Homme Profil pro
    Analyste applicatif
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste applicatif

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Le champ INDICATIF permet de savoir pour quelle application le fichier XML contenu dans le champ FBLOB est destiné.
    Effectivement il n'est pas envisageable de changer l'application en amont. Il faut absolument traiter les données telles que je vous les ait présentées. La
    seule alternative possible est de traiter avec un champ CLOB au lieu d'un champ BLOB.
    En revanche, aucune action n'est attendue par rapport aux données initiales, aucun besoin de flaguer, supprimer ou mettre à jour les données exportées.
    Je n'ai jamais utilisé la commande BCP, mais je pense qu'elle permet bien de copier le contenu d'un champ d'une table sqlserver dans un fichier. Cela correspond exactement à ce que je cherche à réaliser.

  8. #8
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Aurais-tu par hasard la suite B.I. avec ton SQLSERVER?
    Parceque il y a un truc très très bien fait (si si si) qui s'apelle SSIS qui te permetrait de faire ca sans trop de peine...
    Bien à toi,

    Loic
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  9. #9
    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 : 42
    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
    Il semble que ce soit un fichier plat qui contient plusieurs champs, dont le dernier est un document XML.
    S'il n'y a pas de retour à la ligne avant la fin de chaque ligne à insérer dans la table, alors BCP peut très bien faire le travail ...

    Encore faudrait-il que nous ayons l'instruction BCP utilisée, ainsi que l'erreur obtenue ...

    @++

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Il me semble qu'il veut faire l'opération inverse justement :
    Exporter le contenu d'une colonne XML vers un fichier XML sur le disque d'un PC distant...

  11. #11
    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 : 42
    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
    OK, désolé.
    Dans ce cas il suffit de créer un fichier de format.

    J'ai donc créé sur mon PC dont le nom est ELSUKET et la BD Demo, la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE pada62
    (
    	INDICATIF char(10)
    	, FBLOB varbinary(max)
    )
    A noter que l'instance SQL Server 2008 est une instance par défaut (elle n'est pas nommée), mais cela ne change pas grand chose.

    que j'ai peuplé comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT	dbo.pada62 VALUES ('indicatif', CAST('<test>unTest</test>' AS varbinary(max)))

    Dans une fenêtre d'invite de commandes, à l'invite, après s'être positionné dans le dossier dans lequel on souhaite réaliser l'export (dans mon cas, C:\), on crée le fichier de format comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bcp Demo.dbo.pada62 format nul -S ELSUKET -T -n -f pada62.fmt

    Je trouve le fichier à la racine de C.

    Ensuite on réalisé l'export. Toujours à l'invite, en étant positionné sur C: :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bcp Demo.dbo.pada62 out pada62.dat -S ELSUKET -T -n -f pada62.fmt

    Et j'ai bien un fichier pada62.dat créé.

    Je teste l'import. Pour cela je crée une autre table vite-fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 0 *
    INTO	test_import
    FROM	pada62

    Et l'import se réalise comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bcp Demo.dbo.test_import in pada62.dat -S ELSUKET -T -n -f pada62.fmt

    Un SELECT * FROM dbo.test_import me confirme la ligne a bien été insérée.

    A lire : Utilitaire BCP

    Ce que je comprend moins c'est le but de stocker un document XML dans une colonne de type varbinary ...
    Le type XML a été introduit avec SQL Server 2005, et il permet d'enregistrer des schémas XML (CREATE XML SCHEMA COLLECTION) pour typer fortement une colonne de type XML.
    Cela permet de valider le document XML lors de sa manipulation, en plus des capacités d'extraction des données des documents XML stockés dans une telle colonne ...

    A lire : le petit billet que j'ai publié sur le choix des types de données

    @++

  12. #12
    Candidat au Club
    Homme Profil pro
    Analyste applicatif
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste applicatif

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Je rentre d'une semaine de congé et je découvre une solution qui résout parfaitement mon problème. Un grand merci.

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

Discussions similaires

  1. LINQ vers fichier XML
    Par ChapiBoulo dans le forum Débuter
    Réponses: 2
    Dernier message: 20/05/2009, 13h34
  2. LINQ vers fichier XML
    Par ChapiBoulo dans le forum Débuter
    Réponses: 0
    Dernier message: 18/05/2009, 13h29
  3. [XML] Extraire la valeur d'un champ dans un fichier XML
    Par dinozo13 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 06/10/2008, 12h53
  4. Extraire un champ BLOB vers un fichier sur le serveur
    Par ALEX77 dans le forum Firebird
    Réponses: 7
    Dernier message: 24/09/2007, 21h24
  5. [Oracle] Ecriture dans champ BLOB de fichiers joints par formulaire
    Par mcshu dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/02/2007, 14h33

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