Académique Documents
Professionnel Documents
Culture Documents
Version 1.0
Z
Grgory CASANOVA
Sommaire
1 2 3
Introduction ..................................................................................................................................... 3 Pr requis......................................................................................................................................... 4 XML typ et non typ ...................................................................................................................... 5 3.1 3.2 Non typ .................................................................................................................................. 5 Typ ......................................................................................................................................... 5
XML et DML ..................................................................................................................................... 7 4.1 4.2 Le DML Gnral ....................................................................................................................... 7 Le DML Spcifique ................................................................................................................... 9 Query()............................................................................................................................. 9 Value() ............................................................................................................................. 9 Exist() ............................................................................................................................. 10 Nodes() .......................................................................................................................... 11 Modify() ......................................................................................................................... 12 Les requtes XQuery et XPath ....................................................................................... 13
1 Introduction
Le type de donnes XML est apparu dans SQL Server la premire fois pour la version 2000. Ce rsultat est d une volution des types de stockages pour les entreprises. Le type de donnes XML tant de plus en plus utilis, il tait vident que Microsoft sadapte dans son SGBDR. Dans le cas prsent, ce qui nous intresse nest pas de pouvoir stocker les donnes au format XML, mais de les exploiter directement et de faon optimale grce SQL Server 2008. Il sera donc possible, grce SQL Server, dintgrer des donnes contenues dans un document XML, aux tables dans un schma relationnel, ou inversement, de produire un document XML, grce aux donnes relationnelles dune ou plusieurs tables dans une base de donnes. Le but de lintgration du XML dans SQL Server, est de pouvoir stocker les donnes dans leur format natif, cest pourquoi il est possible dintgrer des donnes dans un schma relationnel, aussi bien que dans leur format XML dorigine. Il nest pas difficile de comprendre que Microsoft a considrablement augment sa capacit de gestion des donnes XML depuis la version 2000, dans le sens ou il ntait avant possible que de produire un document XML partir de donnes relationnelles alors que dsormais il est possible de travailler directement dessus dans leur forme native. De faon gnrale, les types de donnes, quils soient relationnel ou typs XML, ne sont pas en concurrence dans votre base de donnes. Chacun possde ses avantages et ses inconvnients. En effet, le XML sera particulirement adapt lorsque nous aurons besoin de faire de lchange dinformation ou encore de lenvoie de messages. Le type XML tant organis de faon hirarchique, Il est donc simple, du moment que la hirarchie est connue, de retrouver des donnes. Les donnes sont types en UTF-16 par SQL Server. Dans SQL Server, il est possible dassocier une colonne de type XML une collection de schma pour satisfaire les exigences du W3C en matire de XML. Dans le cas o la colonne qui contient les documents est attache des collections de schma, on dira que le XML est typ, sinon il sera non typ. Pour ce cours, nous allons utiliser une table, qui possdera une seule colonne type XML, dont le script est le suivant :
CREATE TABLE Donnees_XML (Colonne_XML XML)
Nous nallons pas pouvoir traiter le langage XML dans sa totalit dans ce cours, cest pourquoi, si ce langage vous intresse, il vous est possible de trouver de la documentation sur celui-ci, ladresse suivante : http://www.w3.org/TR/REC-xml/ .
2 Pr requis
Pour pouvoir comprendre ce chapitre au mieux, vous devez connaitre : Les diffrentes oprations possibles sur une base de donnes, grce au T-SQL (Chapitre 4).
3.2 Typ
Des donnes XML types seront, comme nonc prcdemment, des documents lis une collection de schmas. Puisque dans SQL Server, nous stockons les documents XML dans les colonnes types XML, il est possible de rattacher directement une collection de schmas une colonne particulire, afin que tous les documents devant tre stocks dans la colonne soient concerns par la collection de schmas. Il ne sera donc pas possible, si une collection de schma est li une colonne, dinsrer un document ne respectant pas le schma dfinit. On peut donc dfinir les schmas comme des contraintes dintgrit concernant les documents XML. La gestion des collections de schmas XML se font par les mots cl CREATE XML SCHEMA COLLECTION, ALTER XML SCHEMA COLLECTION ET DELETE XML SCHEMA COLLECTION. Chaque collection va pouvoir contenir un ou plusieurs schmas XML, et va pouvoir tre modifi aprs sa cration, ce qui va nous permettre de sadapter au fait de devoir ajouter ou supprimer des schmas dans la collection. La gestion des collections sera alors bien plus simple et flexible. La cration dun schma se fait ainsi :
CREATE XML SCHEMA COLLECTION Schema_XML AS N'<?xml version="1.0" encoding="UTF-16"?>'+ '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">'+ '<xs:complexType name="Client">'+ '<xs:sequence>'+ '<xs:element name="Nom"/>'+ '<xs:element name="Prenom"/>'+ '</xs:sequence>'+ '</xs:complexType>'+ '</xs:schema>';
Dans cet exemple, la colonne laquelle sera rattach le schma devra comporter le mme schma que dfinit aprs la clause AS. Dsormais pour rattacher ce schma une colonne, il faut le dfinir la cration de la table, comme ceci :
CREATE TABLE Donnees_XML (Colonne_XML XML (Schema_XML))
La colonne ou est dsormais dfini le schma ne pourra accepter que des valeurs formates ce schma. Note : Pour des donnes de type XML, il nest pas toujours possible de dfinir lavance tout ce quelles vont contenir. Par exemple, on pourra ajouter un numro de tlphone pour le complter. Dans ce cas, le mot cl any nous aide dans cet objectif.
CREATE XML SCHEMA COLLECTION Schema_XML AS N'<?xml version="1.0" encoding="UTF-16"?>'+ '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">'+ '<xs:complexType name="Client">'+ '<xs:sequence>'+ '<xs:element name="Nom"/>'+ '<xs:element name="Prenom"/>'+ '<xs:any namespace="autre" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>'+ '</xs:sequence>'+ '</xs:complexType>'+ '</xs:schema>';
Le mot cl any est suivit des attributs suivants : - Namespace : lespace de nom utilis pour la validation des lments de ce type. - processContents : indique la manire dont les lments doivent tre valids par SQL Server. Trois valeurs sont possibles pour cet attribut : - skip : les lments ne sont pas valids par rapport un schma. - strict : les lments sont valids ncessairement par un schma. - lax : les lments sont valids par un schma seulement si celui-ci existe dans la base. - minOccurs : nombre minimal dlments de ce type. - maxOccurs : nombre maximal dlments de ce type.
4 XML et DML
Pour rendre plus simple la comprhension de cette partie, nous allons supprimer la table que nous avons cre avant, puis la recrer de faon ce quelle ne soit plus lie au schma.
DROP TABLE Donnees_XML GO CREATE TABLE Donnees_XML (catalogue XML) GO
Dcouvrons maintenant les diffrentes instructions du DML appliques la manipulation du type de donnes XML.
INSERT INTO [Entreprise].[dbo].[Donnees_XML] ([Colonne_XML]) VALUES ('<article> <nom>Windows Seven</nom> <prix>139</prix> </article>') GO
Ici, nous insrons un article dont la dfinition contient un nom et un prix. Il est aussi possible dimporter les donnes XML depuis un fichier. Pour cela, crez un fichier que nous appellerons Cours.txt, et insrez le code suivant dans celui-ci :
<article> <nom>Windows Seven</nom> <prix>139</prix> </article>
Grce aux instructions OPENROWSET et BULK, le contenu du fichier dont le chemin est 'C:\Users\Grgory Casanova\Desktop\Cours.txt' sera pars et insr dans la colonne de type XML de notre table. Dotnet France Association - CASANOVA Grgory
Note : Il est important de noter quici, nous changeons soit lintgralit de lenregistrement, soit rien. Tout lenregistrement doit tre redfinit dans le cas dun update simple. Il est indispensable de rcrire la totalit du code XML. SELECT :
Lintgralit des donnes stockes dans chaque enregistrement sera slectionne. Avec une instruction SELECT simple, il nest pas possible de slectionner seulement le prix de larticle par exemple. Le rsultat dune instruction SELECT se prsente de cette manire :
On remarque alors que le champ est cliquable. Le rsultat Complet est accessible avec un clic sur celui-ci. Nous somme alors redirigs vers une nouvelle fentre de requte qui nous prsente lintgralit du code XML contenu dans le rsultat, comme ceci :
DELETE :
Il est aussi possible de cliquer sur le rsultat de la requte pour afficher le rsultat complet dans le gestionnaire de donnes XML. On retiendra que ce type de requte retourne un nud complet du document XML et non la valeur comprise entre les balises dun nud de ce mme document. 4.2.2 Value() Grce linstruction value(), nous allons pouvoir extraire la valeur contenue entre les balises XML dun nud du document XML sur lequel on travaille. Prenons un exemple :
USE Entreprise SELECT catalogue.value('(article/nom)[1]', 'nvarchar(50)') FROM Donnees_XML
La requte value suit le nom de la colonne de type XML o nous allons oprer. Cette requte prend 2 arguments qui sont le chemin de la valeur et un singleton, et le type de retour de la requte. La requte ci-dessus produit le rsultat suivant :
10
Travailler avec des donnes de type XML 28/07/2009 On remarque alors que les balises ont disparues, et quil ne reste que la valeur comprise dans le nud que nous avons plac en argument dans notre requte value(). 4.2.3 Exist() Cette instruction fait partie des instructions XQuery, et retourne une valeur scalaire de type bit. Si les donnes sont localises, sa valeur est 1, si les donnes ne peuvent pas tre localises, sa valeur est 0 et si la valeur de linformation trouver est NULL, alors sa valeur est NULL. Ce type dinstruction est pratique utiliser conjointement aux autres instructions XQuery disponibles, par exemple, pour viter la leve derreurs imprvues. Pour prendre un exemple plus concret, nous allons faire une insertion dans la table.
INSERT INTO Donnees_XML VALUES ('<article> <nom>Windows Seven</nom> <prix>139</prix> </article>'), ('<article> <nom>Windows Vista</nom> <prix>100</prix> </article>'), ('<article> <nom>Windows XP</nom> </article>')
Cette fois-ci, nous avons ajout trois lignes dans notre colonne XML, deux contenant un prix et la troisime nen contenant pas. Voyons maintenant le rsultat dun exemple dutilisation de linstruction exist() :
Cette requte retourne toutes les lignes pour laquelle il existe une balise XML <prix> non NULL. En voici le rsultat :
On remarque alors que llment pour lequel il manquait le prix nest pas prsent, puisque la balise XML <prix>, nexistait pas. En revanche, si lon passe la valeur de la requte exist() 0, ce produit sera retourn, en remplacement des deux autre contenant une balise de prix.
SELECT catalogue.value('(article/nom)[1]', 'nvarchar(50)') FROM Donnees_XML WHERE catalogue.exist('(article/prix)[1]') = 0
11
4.2.4
Nodes() Linstruction nodes() va nous permettre de morceler notre rsultat, partir de nuds particuliers, pour retourner seulement le prix par exemple. Dans notre exemple, nous allons morceler le rsultat de rendu dun document XML contenu dans une variable de type XML. Le rsultat retournera plusieurs lignes dans lesquelles chaque prix apparaitra. Nodes() permet par consquent de retourner une suite de lignes de rsultats en dfinissant un nud particulier dans le document XML.
DECLARE @XML XML = '<article> <nom>Windows Seven</nom> <prix>139</prix> </article> <article> <nom>Windows Vista</nom> <prix>100</prix> </article> <article> <nom>Windows XP</nom> </article>' SELECT resultats.x.query('.') from @XML.nodes('article/prix') AS resultats(x)
Il est important de comprendre le fondement de cette requte. Nous aurions pue utiliser une simple requte query() pour retourner les prix du document XML, comme ceci :
DECLARE @XML XML = '<article> <nom>Windows Seven</nom> <prix>139</prix> </article> <article> <nom>Windows Vista</nom> <prix>100</prix> </article> <article> <nom>Windows XP</nom> </article>' SELECT @XML.query('article/prix')
12
Travailler avec des donnes de type XML 28/07/2009 Dont le rsultat est celui-ci :
Simplement, en utilisant une requte query() au lieu dune requte nodes(), tous les prix auraient t dans la mme ligne de rsultat, au lieu dtre spars comme vu dans les exemples. 4.2.5 Modify() Comme son nom lindique, linstruction XQuery modify(), permet de modifier les donnes contenues dans un document XML, de faon cible, contrairement linstruction UPDATE qui nous permet de mettre jour la totalit des donnes contenu dans la colonne. Pour ajouter, modifier ou supprimer des informations dans un document XML via la mthode modify(), on utilisera les instructions XML DML insert, replace value of et delete. Prenons un exemple :
DECLARE @XML1 XML = '<ROOT> <article> <nom>Windows Seven</nom> <prix>139</prix> </article> <article> <nom>Windows Vista</nom> <prix>100</prix> </article> <article> <nom>Windows XP</nom> </article> </ROOT>' DECLARE @XML2 XML ='<quategorie>informatique</quategorie>' SET @XML1.modify('insert sql:variable ("@XML2") as last into (/ROOT/article)[1]') SET @XML1.modify('insert sql:variable ("@XML2") as last into (/ROOT/article)[2]') SET @XML1.modify('insert sql:variable ("@XML2") as last into (/ROOT/article)[3]')
Cette instruction va permettre de rajouter aux trois lignes, une valise quategorie pour chaque nud article du document. Voici le rsultat :
13
<ROOT> <article> <nom>Windows Seven</nom> <prix>139</prix> <quategorie>informatique</quategorie> </article> <article> <nom>Windows Vista</nom> <prix>100</prix> <quategorie>informatique</quategorie> </article> <article> <nom>Windows XP</nom> <quategorie>informatique</quategorie> </article> </ROOT>
4.2.6
Les requtes XQuery et XPath Il existe un langage pour excuter la plupart des requtes possible dans SQL Server pour le format XML : Le XQuery et le XPath. Couvrir la totalit de ce langage serai trop long pour un seul chapitre, de plus, il est entirement disponible sur le site officiel du W3C laddresse suivante : http://www.w3.org/TR/xquery .
Si FOR XML AUTO transcrit directement les nuds de votre format relationnel au format XML, il est possible de dfinir ce chemin de la manire suivante :
USE Entreprise SELECT Id_Client, Nom_client FROM Client FOR XML PATH('Client'), TYPE
14
<Client> <Id_Client>1</Id_Client> <Nom_client>CASANOVA</Nom_client> </Client> <Client> <Id_Client>2</Id_Client> <Nom_client>RAVAILLE</Nom_client> </Client> <Client> <Id_Client>3</Id_Client> <Nom_client>DOLLON</Nom_client> </Client> <Client> <Id_Client>4</Id_Client> <Nom_client>VERGNAULT</Nom_client> </Client> <Client> <Id_Client>5</Id_Client> <Nom_client>VASSELON</Nom_client> </Client> <Client> <Id_Client>6</Id_Client> <Nom_client>HOLLEBEC</Nom_client> </Client>
De plus, lune des rgles essentielle du XML est la suivante : Tout nud doit avoir un seul nud au niveau suprieur. Cest pourquoi il existe la clause ROOT. En voici un exemple :
USE Entreprise SELECT Id_Client, Nom_client FROM Client FOR XML PATH('Client'),ROOT('ROOT'), TYPE
15
<ROOT> <Client> <Id_Client>1</Id_Client> <Nom_client>CASANOVA</Nom_client> </Client> <Client> <Id_Client>2</Id_Client> <Nom_client>RAVAILLE</Nom_client> </Client> <Client> <Id_Client>3</Id_Client> <Nom_client>DOLLON</Nom_client> </Client> <Client> <Id_Client>4</Id_Client> <Nom_client>VERGNAULT</Nom_client> </Client> <Client> <Id_Client>5</Id_Client> <Nom_client>VASSELON</Nom_client> </Client> <Client> <Id_Client>6</Id_Client> <Nom_client>HOLLEBEC</Nom_client> </Client> </ROOT>
4.4 OpenXML
Cette instruction permet de traiter un document XML sous la forme dun jeu de rsultats. Il est possible dutiliser cette instruction couple un SELECT, INSERT, UPDATE et DELETE. Pour utiliser cette mthode, il est necessaire de retenir lutilisation de deux procdures stockes qui sont les suivantes : Sp_xml_preparedocument : permet de prparer un document texte au format XML. Cette procdure stocke retourne un identifiant qui va servir la mthode OpenXML retrouver les donnes XML cres. Sp_xml_removedocument : permet de librer lespace mmoire occup par le document prpar par la procdure stocke prcdente.
Prenons un exemple :
DECLARE @ID_XML int DECLARE @XML1 nvarchar(500) = '<ROOT> <article nom="Windows Seven" prix="139"></article> </ROOT>' exec sp_xml_preparedocument @ID_XML OUT, @XML1 SELECT * FROM OPENXML(@ID_XML, 'ROOT/*') WITH (nom nvarchar(50), prix money) exec sp_xml_removedocument @ID_XML
16
On stocke dans un premier temps notre document texte dans une variable. On le prpare ensuite grce la procdure stocke de prparation de documents XML. On applique ensuite OPENXML pour extraire les donnes contenues dans le document au format XML. Lorsque linstruction SELECT est termine, on utilise la procdure stocke de suppression de document XML pour librer lespace mmoire contenant le document prpar.
4.5 OPENROWSET
Cette mthode permet de travailler facilement avec des donnes prsentes lextrieur du serveur. La source de donnes peut tre le systme de fichier Windows ou encore une autre base OLEDB. Prenons un exemple :
USE Entreprise INSERT INTO Donnees_XML SELECT INFO FROM (SELECT * FROM OPENROWSET (BULK 'C:\Users\Grgory Casanova\Desktop\Cours.xml', SINGLE_BLOB) AS INFO) AS fichierXML(INFO)
Dans cet exemple, on insre les donnes contenues dans un document XML, prsent sur le systme de fichier Windows, dans une table contenant une colonne type XML.
17
5 INDEX et XML
Lors dune requte, les donnes types XML peuvent tre volumineuses ou/et nombreuses, et donc tre couteuses en ressources au niveau serveur. Un index dit principal, sur une colonne XML, est construit de la mme manire quun index sur une colonne dun type simple. Il existe simplement des index dit secondaires qui vont servir acclrer la recherche de donnes. Les index secondaires sont dfinis celons des classes de requtes frquentes : PATH : Pour les requtes portant sur le chemin daccs. PROPERTY : Pour les requtes portant sur les proprits. VALUE : Pour les requtes portant sur des valeurs.
Tout dabord, la cration dun index primaire ncessite que la cl primaire de la table qui contient la colonne XML contienne un index organis. On peut alors crer lindex primaire de cette faon :
CREATE PRIMARY XML INDEX nom_index ON nom_table(Colonne)
Il nest donc possible de crer un index secondaire seulement si un index primaire est dfinit sur cette colonne. Voici la mthode de construction :
CREATE XML INDEX nom_index_secondaire ON nom_table(Colonne) USING XML INDEX nom_index_primaire FOR (PATH|PROPERTY|VALUE)
Vous lavez compris avec la structure gnrale, la cration de lindex secondaire ncessite le rfrencement de lindex primaire. Il est alors possible de choisir les trois options dfinis auparavent : PATH : Ce genre de clause amliore sensiblement les performances dune requte contenant une clause exist(). PROPERTY : Amliore les performances dune requte utilisant la mthode value(). VALUE : Amliore aussi sensiblement la mthode exist().
18
6 Conclusion
Le type de donnes XML est de plus en plus prsent dans le cadre de lentreprise, et dans le cas gnral dans le cadre de linformation, en particulier lors de linteraction dapplications clientes avec la base. Toutes les informations prsentes dans ce chapitre vous permettrons de transformer des donnes relationnelles en donnes XML et linverse, aussi bien quindexer une colonne de type XML.