Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2011, 09h34   #1
Invité de passage
 
Homme Pascal Adam
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Pascal Adam
Localisation : Belgique

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 1
Points : 1
Par défaut Champ BLOB vers fichier XML

* Bonjour, *

Avec l'instruction suivante :
Code :
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
pada62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 11h43   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

Essayez ceci :

Code :
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h59   #3
Invité de passage
 
Homme Pascal Adam
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Pascal Adam
Localisation : Belgique

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 1
Points : 1
Personne ne connait la commande BCP ?
pada62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 18h51   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Donnez un exemple de ce que vous voulez faire...

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 10h45   #5
Invité de passage
 
Homme Pascal Adam
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Pascal Adam
Localisation : Belgique

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 1
Points : 1
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 ?
pada62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 10h20   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 10h33   #7
Invité de passage
 
Homme Pascal Adam
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Pascal Adam
Localisation : Belgique

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 1
Points : 1
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.
pada62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 11h09   #8
Nouveau Membre du Club
 
Homme Loïc Bernard
Consultant en Business Intelligence
Inscription : avril 2008
Messages : 44
Détails du profil
Informations personnelles :
Nom : Homme Loïc Bernard
Âge : 34
Localisation : Belgique

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 44
Points : 32
Points : 32
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
lbernard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 13h00   #9
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
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 ...

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 13h03   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 09h22   #11
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
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 :
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 :
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 :
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 :
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 :
1
2
3
SELECT TOP 0 *
INTO	test_import
FROM	pada62

Et l'import se réalise comme suit :

Code :
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 27/04/2011, 16h08   #12
Invité de passage
 
Homme Pascal Adam
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Pascal Adam
Localisation : Belgique

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 1
Points : 1
Je rentre d'une semaine de congé et je découvre une solution qui résout parfaitement mon problème. Un grand merci.
pada62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h23.


 
 
 
 
Partenaires

Hébergement Web