Partager via


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

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

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

Définir les options de requête requises

Lorsque vous interrogez des colonnes ou des variables de type XML à l’aide de méthodes de type de données xml , les options suivantes doivent être définies 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 sur les méthodes de type de données xml échouent.

Fonctionnalités d’une instance XML qui ne sont pas conservées

SQL Server conserve le contenu de l’instance XML, mais ne conserve pas les aspects de l’instance XML qui ne sont pas considérés comme significatifs 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 dans une instance n’est pas conservée lorsque l’instance est stockée 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, par exemple <?xml version='1.0'?>, n’est pas conservée lors du stockage de 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 dans 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’attribut

Les guillemets simples et les guillemets doubles autour des valeurs d’attribut 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