Options de requête XML et données conservées

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

Cet article décrit les options de requête que vous devez spécifier pour interroger les données XML. Elle décrit aussi les parties des instances XML qui ne sont pas conservées lorsqu'elles sont stockées dans des bases de données.

Définir les options d'interrogation requises

Quand vous interrogez des variables ou colonnes de type xml à l’aide de méthodes de type de données xml , vous devez définir les options suivantes, comme indiqué.

Options SET Valeurs requises
ANSI_NULLS ACTIVÉ
ANSI_PADDING ACTIVÉ
ANSI_WARNINGS ACTIVÉ
ARITHABORT ACTIVÉ
CONCAT_NULL_YIELDS_NULL ACTIVÉ
NUMERIC_ROUNDABORT OFF
QUOTED_IDENTIFIER ACTIVÉ

Si les options ne sont pas définies comme indiqué, les requêtes et les modifications portant sur les méthodes de type de données xml sont vouées à l’échec.

Caractéristiques d'une instance XML qui ne sont pas conservées

SQL Server préserve le contenu de l'instance XML, mais ne préserve pas les aspects de l'instance XML qui ne sont pas considérés comme importants dans le modèle de données XML. Cela signifie qu'une instance XML extraite peut ne pas être identique à l'instance stockée sur le serveur, mais contiendra les mêmes informations.

Déclaration XML

La déclaration XML d'une instance n'est pas conservée lors du stockage de l'instance dans la base de données. Par exemple :

CREATE TABLE T1 (Col1 int primary key, Col2 xml);
GO
INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>');
GO
SELECT Col2
FROM T1;

Le résultat est <doc/>.

La déclaration XML, telle que <?xml version='1.0'?>, n’est pas conservée en cas de stockage des données XML dans une instance de type de données xml . C'est la procédure normale. La déclaration XML () et ses attributs (version/encoding/stand-alone) sont perdus une fois les données converties au type xml. La déclaration XML est traitée comme une directive de l'analyseur XML. Les données XML sont stockées en interne au format ucs-2. Toutes les autres instructions de traitement dans l'instance XML sont conservées.

Ordre des attributs

L'ordre des attributs d'une instance XML n'est pas conservé. Quand vous interrogez l’instance XML stockée dans la colonne de type xml , l’ordre des attributs du code XML résultant peut différer de l’ordre utilisé dans l’instance XML d’origine.

Guillemets autour des valeurs d'attributs

Les guillemets et les guillemets simples qui encadrent les valeurs des attributs ne sont pas conservés. Les valeurs des attributs sont stockées sous forme de paire nom et valeur. Les guillemets ne sont pas stockés. En cas d'exécution d'une requête XQuery sur une instance XML, le code XML résultant est sérialisé, et les valeurs des attributs figurent entre guillemets.

DECLARE @x xml;
-- Use double quotation marks.
SET @x = '<root a="1" />';
SELECT @x;
GO
DECLARE @x xml;
-- Use single quotation marks.
SET @x = '<root a=''1'' />';
SELECT @x;
GO

Les deux requêtes retournent = <root a="1" />.

Préfixes d'espace de noms

Les préfixes d'espace de noms ne sont pas conservés. Quand vous définissez une requête XQuery sur une colonne de type xml , le code XML sérialisé qui en découle peut retourner des préfixes d’espace de noms différents.

DECLARE @x xml;
SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc">
            <ns2:SomeElement/>
          </ns1:root>';
SELECT @x;
SELECT @x.query('/*');
GO

Le préfixe d'espace de noms peut avoir une valeur différente dans le résultat. Par exemple :

<p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>

Voir aussi