Génération d'instances XML
Comme l'explique la rubrique Type de données XML, vous pouvez stocker des instances XML dans une base de données SQL Server. Cette rubrique explique :
- comment générer des instances XML ;
- comment convertir des instances XML en chaînes.
Génération d'instances XML
Dans SQL Server, vous pouvez générer des instances XML des manières suivantes :
- Conversion du type des instances de chaîne
- Utilisation de l'instruction SELECT avec la clause FOR XML
- Utilisation des affectations de constante
- Utilisation du chargement en bloc
Conversion du type des instances binaires et de chaîne
Vous pouvez interpréter tous les types de données chaîne SQL Server, comme [n][var]char, [n]text, varbinary et image, en type xml en convertissant (via CAST ou CONVERT) la chaîne en type de données xml. Le code XML non typé est vérifié de façon à voir s'il est bien formé. Si un schéma est associé au type xml, une validation a également lieu. Pour plus d'informations, consultez XML typé et non typé.
Les documents XML peuvent être codés à l'aide de différents codages (par exemple, UTF-8, UTF-16, Windows 1252). Les règles définissant le comportement de l'analyseur et l'interaction entre les types de sources binaires et de chaîne avec le codage du document XML sont décrites ici.
Dans la mesure où le type nvarchar présuppose un codage Unicode sur deux octets tel que UTF-16 ou UCS-2, l'analyseur XML traite la valeur de type chaîne comme un document ou un fragment XML codé en Unicode sur 2 octets. Ceci signifie que le document XML doit être codé à l'aide d'un codage Unicode sur deux octets et être compatible avec le type de données source. Un document XML codé en UTF-16 peut, mais ce n'est pas obligatoire, présenter un indicateur d'ordre des octets (ou BOM) UTF-16 puisque le contexte du type de source est suffisamment explicite sur le fait qu'il ne peut s'agir que d'un document codé en Unicode sur deux octets.
Le contenu d'une chaîne de type varchar est traité, par l'analyseur XML, comme un fragment ou un document XML codé sur un octet. Étant donné que la chaîne source varchar est associée à une page de codes, l'analyseur utilise cette page pour le codage si aucun code explicite n'est spécifié dans le code XML lui-même. Si une instance XML dispose d'un BOM ou d'une déclaration de codage, ces éléments doivent être cohérents par rapport à la page de codes sinon l'analyseur renvoie une erreur.
Le contenu du type varbinary est traité comme un flux CODEPOINT transmis directement à l'analyseur XML. Le document ou le fragment XML doit donc fournir le BOM ou toute autre information de codage incluse. L'analyseur se contente de consulter le flux pour déterminer le codage. Ceci signifie que le document XML codé en UTF-16 doit fournir le BOM UTF-16 et qu'une instance sans BOM ni déclaration de codage est interprétée en UTF-8.
Si le codage du document XML n'est pas connu à l'avance et que, avant la conversion en XML, les données sont transmises comme étant de type chaîne (string) ou binaire (binary) à la place de données XML, il est recommandé de traiter les données en tant que type varbinary. Ainsi, lorsque les données d'un fichier XML sont lues par le biais de OpenRowset(), ces données à lire doivent être spécifiées comme valeur varbinary(max) :
select CAST(x as XML)
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)
Dans SQL Server, le code XML est représenté en interne dans un format binaire encodé en UTF-16. Le codage assuré par l'utilisateur n'est pas conservé, mais est pris en compte dans le processus d'analyse.
Conversion des types CLR définis par l'utilisateur
Si un type CLR défini par l'utilisateur présente une sérialisation XML, les instances de ce type peuvent être explicitement converties en un type de données XML. Pour obtenir des détails sur la sérialisation XML d'un type CLR défini par l'utilisateur, consultez XML Serialization from CLR Database Objects.
Gestion des espaces blancs dans le code XML typé
Dans SQL Server, les espaces blancs figurant dans le contenu d'un élément ne sont pas significatifs s'ils se trouvent dans une séquence de données de type caractères composée uniquement d'espaces blancs délimités par des balises (balise de début ou de fin) et qu'ils ne font pas appel au codage d'entité. (Les sections CDATA sont ignorées). Ce traitement des espaces blancs se différencie de la description des espaces blancs donnée dans la spécification XML 1.0 publiée par le W3C (World Wide Web Consortium). En effet, l'analyseur XML de SQL Server ne reconnaît qu'un nombre limité des sous-ensembles DTD tels qu'ils existent dans XML 1.0. Pour plus d'informations sur les sous-ensembles DTD pris en charge dans SQL Server 2005, consultez CAST et CONVERT (Transact-SQL).
Par défaut, l'analyseur XML rejette les espaces blancs non significatifs lors de la conversion des données chaîne en XML si l'une des conditions suivantes est vraie :
- L'attribut
The xml:space
n'est pas défini sur un élément ni sur ses éléments ancêtres. - L'attribut
xml:space
en vigueur sur un élément, ou sur l'un de ses éléments ancêtres, a la valeur par défaut.
Par exemple :
declare @x xml
set @x = '<root> <child/> </root>'
select @x
Voici le jeu de résultats obtenu :
<root><child/></root>
Vous pouvez toutefois modifier ce comportement. Pour conserver les espaces blancs dans une instance du type de données xml, utilisez l'opérateur CONVERT et donnez à son paramètre facultatif style la valeur 1. Par exemple :
SELECT CONVERT(xml, N'<root> <child/> </root>', 1)
Si le paramètre style n'est pas utilisé ou s'il a la valeur 0, les espaces non significatifs ne sont pas conservés lors de la conversion de l'instance du type de données xml. Pour plus d'informations sur l'utilisation de l'opérateur CONVERT et de son paramètre style lors de la conversion de données chaîne en instances du type de données xml, consultez CAST et CONVERT (Transact-SQL).
Exemple A : conversion d'une valeur chaîne en xml typé et affectation de cette valeur à une colonne
L'exemple suivant convertit une variable chaîne qui contient un fragment XML en type de données xml, puis la stocke dans la colonne de type xml :
CREATE TABLE T(c1 int primary key, c2 xml)
go
DECLARE @s varchar(100)
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'
L'opération d'insertion suivante convertit implicitement une chaîne en type xml :
INSERT INTO T VALUES (3, @s)
Vous pouvez utiliser la fonction cast() pour convertir explicitement la chaîne en type xml :
INSERT INTO T VALUES (3, cast (@s as xml))
Vous pouvez aussi utiliser la fonction convert(), comme le montre l'exemple suivant :
INSERT INTO T VALUES (3, convert (xml, @s))
Exemple B : conversion d'une valeur chaîne en xml typé et affectation de cette valeur à une variable
Dans l'exemple suivant, une chaîne est convertie en type xml, puis affectée à une variable de type xml :
declare @x xml
declare @s varchar(100)
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'
set @x =convert (xml, @s)
select @x
Utilisation de l'instruction SELECT avec la clause FOR XML
Vous pouvez utiliser la clause FOR XML dans une instruction SELECT pour renvoyer les résultats sous forme de code XML. Par exemple :
DECLARE @xmlDoc xml
SET @xmlDoc = (SELECT Column1, Column2
FROM Table1, Table2
WHERE Some condition
FOR XML AUTO)
...
L'instruction SELECT renvoie un fragment textuel XML qui est ensuite analysé au cours de l'affectation à la variable de type xml.
Vous pouvez également utiliser la directive TYPE dans la clause FOR XML pour renvoyer directement les résultats d'une requête FOR XML en type xml :
Declare @xmlDoc xml
SET @xmlDoc = (SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=19
FOR XML AUTO, TYPE)
SELECT @xmlDoc
Voici le jeu de résultats obtenu :
<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...
Dans l'exemple suivant, le code xml typé d'une requête FOR XML est inséré dans une colonne de type xml :
CREATE TABLE T1 (c1 int, c2 xml)
go
INSERT T1(c1, c2)
SELECT 1, (SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=19
FOR XML AUTO, TYPE)
SELECT * FROM T1
go
Pour plus d'informations sur FOR XML, consultez Construction de code XML à l'aide de FOR XML.
Utilisation des affectations de constante
Une constante chaîne peut être utilisée à la place d'une instance du type de données xml. Cela revient à convertir implicitement (via CAST) une chaîne en XML. Par exemple :
DECLARE @xmlDoc xml
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>'
L'exemple précédent convertit implicitement la chaîne en type de données xml, puis l'affecte à une variable de type xml.
L'exemple suivant insère une chaîne constante dans une colonne de type xml :
CREATE TABLE T(c1 int primary key, c2 xml)
INSERT INTO T VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>')
Remarque : |
---|
En cas de XML typé, la conformité du code XML est validée par rapport au schéma spécifié. Pour plus d'informations, consultez XML typé et non typé. |
Utilisation du chargement en bloc
Considérablement améliorée, la fonction OPENROWSET (Transact-SQL) vous permet de charger en bloc des documents XML dans la base de données. Vous pouvez charger en bloc des instances XML depuis des fichiers vers des colonnes de type xml de la base de données. Pour obtenir des exemples fonctionnels, consultez Exemples d'importation et d'exportation en bloc de documents XML.
Sérialisation des instances XML
Vous pouvez utiliser les instructions CAST ou CONVERT pour sérialiser des documents et des fragments de type xml en type de données [n][var]char ou varbinary.
Une instance du type de données XML convertie en chaîne Unicode ou en type varbinary est sérialisée en UTF-16 par défaut. Si vous la convertissez en une chaîne non-Unicode, elle est sérialisée en fonction de la page de codes du type chaîne cible.
Voir aussi
Concepts
XML typé et non typé
Langage de modification de données XML (XML DML)
Type de données xml
Exemples d'applications XML
Autres ressources
Méthodes des types de données xml