Partage via


Créer des instances de données XML

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Cet article décrit comment générer des 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 masse.

Chaînes de caractères et instances binaires

Vous pouvez interpréter tous les types de données chaîne SQL Server , comme [n][var]char, [n]text, varbinaryet image, en type de données xml en coulant (CAST) ou en convertissant (CONVERT) la chaîne de caractères dans le 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 Comparer du XML typé et du XML non typé.

Les documents XML peuvent être encodés à l’aide de différents encodages (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 l'encodage du document XML sont décrites ici.

Dans la mesure où le type nvarchar présuppose un encodage 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 encodé en Unicode sur 2 octets. Ceci signifie que le document XML doit être encodé à l'aide d'un encodage Unicode sur deux octets et être compatible avec le type de données source. Un document XML encodé 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 encodé 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 encodé sur un octet. Étant donné que la chaîne source varchar est associée à une page de codes, l’analyseur utilise cette page pour l’encodage 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 d’encodage, 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 d'encodage incluse. L'analyseur se contente de consulter le flux pour déterminer l'encodage. Ceci signifie que le document XML encodé en UTF-16 doit fournir le BOM UTF-16 et qu'une instance sans BOM ni déclaration d'encodage est interprétée en UTF-8.

Si l’encodage 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, quand 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);

SQL Server représente en interne le XML dans une représentation binaire efficace qui utilise le codage UTF-16. L'encodage 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 informations sur la sérialisation XML d’un type CLR défini par l’utilisateur, consultez Sérialisation XML à partir d’objets de base de données CLR.

Gérer les espaces blancs dans le XML dactylographié

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 , 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 xml:space n’est pas défini sur un élément ou 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 résultat obtenu :

<root><child/></root>

Cependant, vous pouvez changer ce comportement. Pour conserver les espaces blancs dans une instance du type de données xml, utilisez l’opérateur CONVERT et affectez à 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 durant 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 durant la conversion de données chaîne en instances du type de données xml, consultez CAST et CONVERT (Transact-SQL).

Exemple : 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 explicitement cast() la chaîne en type xml :

INSERT INTO T VALUES (3, CAST(@s AS XML));

Vous pouvez également utiliser convert(), comme indiqué ci-dessous :

INSERT INTO T VALUES (3, CONVERT(XML, @s));

Exemple : 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 retourne 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 retourner 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 résultat 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 FOR XML (SQL Server).

Remarque

SQL Server retourne des instances du type de données xml au client comme résultat des différentes constructions serveur, telles que les requêtes FOR XML qui utilisent la directive TYPE, ou dans lesquelles le type de données xml est utilisé pour renvoyer du code XML d’après des colonnes, des variables et des paramètres de sortie SQL. Dans un code d’application cliente, le fournisseur ADO.NET demande que les informations de type de données xml soient transmises en code binaire à partir du serveur. Toutefois, si vous utilisez FOR XML sans la directive TYPE, les données XML reviennent en tant que type chaîne. Dans tous les cas, le fournisseur client est toujours en mesure de gérer toute forme XML.

Utiliser des affectations constantes

Une constante de 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 Comparer du XML typé et du XML non typé.

Utiliser le chargement en bloc

La fonctionnalité améliorée OPENROWSET (Transact-SQL) vous permet de charger en masse des documents XML dans la base de données. Vous pouvez charger en masse des instances XML à partir de 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 (SQL Server). Pour plus d’informations sur le chargement de documents XML, consultez Charger des données XML.

Contenu de cette section

Article Description
Récupérer et interroger des données XML Décrit les parties des instances XML qui ne sont pas conservées lorsqu'elles sont stockées dans des bases de données.

Voir aussi