Créer des instances de données XML

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Cet article explique comment générer des instances XML.

Dans SQL Server, vous pouvez générer des instances XML de la manière suivante :

  • 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îne de cast de type et instances binaires

Vous pouvez analyser n’importe quel type de données de chaîne SQL Server, tel que [n][var]char, [n]text, varbinary et image, dans le type de données xml en castant (CAST) ou en convertissant (CONVERT) la chaîne en type de données xml. Le code XML non typé est vérifié pour confirmer qu’il est bien formé. S’il existe un schéma associé au type xml , la validation est également effectuée. 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 avoir une marque d’ordre d’octet (BOM) UTF-16, mais il n’a pas besoin, car le contexte du type source indique clairement qu’il ne peut s’agir que d’un document encodé unicode à 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 les données sont transmises en tant que données de chaîne ou binaires au lieu de données XML avant de passer au format XML, il est recommandé de traiter les données comme varbinary. Par exemple, lors de la lecture de données à partir d’un fichier XML à l’aide OpenRowset()de , vous devez spécifier les données à lire sous forme de valeur varbinary(max) :

SELECT CAST(x AS XML);
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

SQL Server représente en interne du code XML dans une représentation binaire efficace qui utilise l’encodage UTF-16. L’encodage fourni par l’utilisateur n’est pas conservé, mais est considéré pendant le processus d’analyse.

Types CLR cast de types 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 plus d’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 l’espace blanc dans xml typé

Dans SQL Server, l’espace blanc à l’intérieur du contenu de l’élément est considéré comme non significatif s’il se produit à l’intérieur d’une séquence de données caractère à espace blanc uniquement délimitée par le balisage, comme les balises de début ou de fin, et n’est pas entitisée. (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). Cela est dû au fait que l’analyseur XML dans SQL Server reconnaît uniquement un nombre limité de sous-ensembles DTD, comme défini dans XML 1.0. Pour plus d’informations sur les sous-ensembles DTD limités pris en charge dans SQL Server, 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 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 de style n’est pas utilisé ou sa valeur est définie sur 0, l’espace blanc non significatif n’est pas conservé pour la conversion de l’instance xml DT. Pour plus d’informations sur l’utilisation de l’opérateur CONVERT et de son paramètre de style lors de la conversion de données de chaîne en instances DT xml, consultez CAST et CONVERT (Transact-SQL).

Exemple : caster une valeur de chaîne en XML typé et l’affecter à 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 au type xml :

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

Vous pouvez également utiliser convert(), comme indiqué dans les sections suivantes :

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

Exemple : convertir une chaîne en XML typé et l’affecter à 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;

Utiliser l’instruction SELECT avec une 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).

Note

SQL Server retourne des instances de type de données xml au client en raison de différentes constructions de serveur, telles que les requêtes FOR XML qui utilisent la directive TYPE, ou où le type de données xml est utilisé pour retourner du code XML à partir de colonnes, de variables et de 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 de 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>');

Note

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 de travail, 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.

Dans 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