[SQL Server 2005] Importer des données XML
Bonjour,
je dois récupérer des données au sein d'un fichier XML. Je cherche actuellement comment faire sur le net, et j'ai un peu de mal à m'en sortir en les méthodes SSIS ou encore BULK.
Si je ne me trompe pas, il existe une méthode VALUE() qui me permet de récupérer une valeur du code XML en en tant que type de données natif SQL Server. Le problème c'est que je ne sais où et comment renseigner le chemin d'accés à mon fichier XML dans ma procédure. Après, j'ai bien compris qu'il fallait fournir la représentation de l'arborescence de mon fichier XML pour pouvoir traiter le fichier ensuite.
Merci de votre aide éventuelle.
sp_xml_preparedocument et OPENROWSET
Merci beaucoup ylarvor,
j'ai été voir dans la doc msdn. Cela semble correspondre à ce que j'attendais. Maintenant il me reste à l'appliquer. Pas si simple, mais il suffit de s'y mettre ;)
Je viendrais ajouter un message ici quand j'aurais été au bout de la solution.
Merci à SQLpro et ylarvor de vos réponses rapides. Cela est une aide précieuse !
OPENROWSET et sp_xml_preparedocument
:resolu:
Ca y est ! Je suis arrivé au bout.
Après avoir fait ma procédure avec sp_xml_preparedocument, je me trouvais bien embêté car il me fallait un flux en entrée.
J'ai résolu le problème en créant une table temporaire une ligne avec colonne de type XML :
Code:
CREATE TABLE tmpXml (XmlCol XML)
Puis je charge ma table avec mon fichier via OPENROWSET
Code:
1 2
| INSERT INTO tmpXml(ColXml)
SELECT * FROM OPENROWSET(BULK 'C:\fic.xml', SINGLE_BLOB) AS x |
Ca y est ! j'ai mon fichier xml dans une colonne de ma base, je n'ai plus qu'à aller la chercher et la mettre en entrée de sp_xml_preparedocument :
Code:
select @doc = ColXml from tmpXml
Oups ! ça ne marche pas ! Il me faut une chaîne en entrée pas un type XML :
Code:
select @doc = convert(nvarchar(1000), ColXml) from tmpXml
Puis :
Code:
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
Ne pas oublier de faire un curseur pour traiter tous les noeuds avec un SELECT OPENXML :
Code:
1 2 3 4 5 6 7
| SELECT code, nom, siret, tel, groupe
FROM OPENXML (@idoc, '/ROOT/client',2) WITH
(code NVARCHAR(50),
nom NVARCHAR(20),
siret NVARCHAR(20),
tel NVARCHAR(20),
groupe NVARCHAR(20)) |
Il me restait un problème : je voulais passer le chemin d'accès du fichier en paramètre de la procédure. Et si je fais :
Code:
1 2
| INSERT INTO tmpXml(ColXml)
SELECT * FROM OPENROWSET(BULK @ficPath, SINGLE_BLOB) AS x |
Ca ne marche pas !
La solution est :
Code:
1 2 3
| declare @vsql varchar(2000)
select @vsql = 'INSERT INTO tmpXml(ColXml) SELECT * FROM OPENROWSET(BULK ''' + @ficPath+ ''', SINGLE_BLOB) AS x'
exec (@vsql) |
Et maintenant tout est OK:yaisse2:
Bon, pour beaucoup d'entre vous tout ça c'est évident, mais je vous assure que ça ne l'était pas pour moi.
:merci: à ceux qui m'ont aidé et à la communauté.