Comparer le code XML typé au XML non typé

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

Vous pouvez créer des variables, des paramètres et des colonnes du type xml . Vous pouvez éventuellement associer une collection de schémas XML à une variable, un paramètre ou une colonne de type xml . Dans ce cas, l'instance de type de données xml est dite typée. Dans le cas contraire, l'instance XML est dite non typée.

Xml bien formé et type de données XML

Le type de données xml implémente le type de données xml de norme ISO. Par conséquent, il peut stocker des documents bien formés en conformité avec XML version 1.0, ainsi que des fragments de contenu XML avec des nœuds de texte et un nombre arbitraire d'éléments de premier niveau dans une colonne XML non typée. Le système vérifie que les données sont bien formées, ne nécessite pas que la colonne soit liée aux schémas XML et rejette les données qui ne sont pas bien formées au sens étendu. Il peut aussi s'agir de variables et de paramètres XML non typés.

schémas XML

Un schéma XML donne les informations suivantes :

  • Contraintes de validation. Chaque fois qu'une instance typée xml est affectée ou modifiée, SQL Server la valide.

  • Informations sur le type de donnes. Les schémas fournissent des informations sur les types des attributs et des éléments de l’instance de type de données xml . Les informations de type fournissent une sémantique opérationnelle plus précise aux valeurs contenues dans l'instance qu'il n'est possible avec xmlnon typé. Par exemple, des opérations arithmétiques décimales peuvent être effectuées sur une valeur décimale, mais pas sur une chaîne. Grâce à cela, le stockage des données typées XML est considérablement plus compact qu'en cas de code XML non typé.

Choix du code XML typé ou non typé

Utilisez le type de données xml non typé dans les cas suivants :

  • Vous n’avez pas de schéma pour vos données XML.

  • Vous avez des schémas, mais vous ne souhaitez pas que le serveur valide les données. Cela est parfois le cas lorsqu’une application effectue une validation côté client avant de stocker les données sur le serveur, ou stocke temporairement les données XML non valides en fonction du schéma, ou utilise des composants de schéma qui ne sont pas pris en charge sur le serveur.

Utilisez le type de données xml typé dans les cas suivants :

  • Il existe des schémas pour vos données XML et vous souhaitez que le serveur valide les données XML par rapport aux schémas XML.

  • Vous voulez profiter de l'optimisation du stockage et des requêtes que permettent les informations de type.

  • Vous voulez tirer parti des avantages que procurent les informations de type lors de la compilation de vos requêtes.

Des colonnes, paramètres et variables en XML typé peuvent stocker des documents ou du contenu XML. Toutefois, vous devez spécifier avec un indicateur si vous stockez un document ou un contenu au moment de la déclaration. De plus, vous devez fournir la collection de schémas XML. Spécifiez DOCUMENT si chaque instance XML a un seul et unique élément de premier niveau. Sinon, utilisez CONTENT. Le compilateur de requête utilise l'indicateur DOCUMENT dans les vérifications de type lors de la compilation de la requête pour déduire les éléments singletons de premier niveau.

Création d’un code XML typé

Avant de pouvoir créer des variables xml typées, des paramètres ou des colonnes, vous devez d’abord inscrire la collection de schémas XML à l’aide de CREATE XML SCHEMA COLLECTION (Transact-SQL). Vous pouvez ensuite associer la collection de schémas XML aux variables, paramètres ou colonnes typés xml .

Dans les exemples suivants, une convention d'affectation des noms en deux parties est utilisée pour spécifier le nom de la collection de schémas XML. La première partie est le nom du schéma et la deuxième est le nom de la collection de schémas XML.

Exemple : Association d’une collection de schémas à une variable de type XML

L’exemple suivant crée une variable de type xml et lui associe une collection de schémas. La collection de schémas spécifiée dans l'exemple est déjà importée dans la base de données AdventureWorks .

DECLARE @x xml (Production.ProductDescriptionSchemaCollection);

Exemple : spécification d’un schéma pour une colonne de type xml

L'exemple suivant crée une table avec une colonne de type xml et spécifie le schéma correspondant :

CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));

Exemple : passage d’un paramètre de type XML à une procédure stockée

L'exemple suivant passe un paramètre de type xml à une procédure stockée et spécifie un schéma pour la variable :

CREATE PROCEDURE SampleProc
  @ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...

Notez les points suivants à propos de la collection de schémas XML :

  • Une collection de schémas XML est disponible seulement dans la base de données où elle a été inscrite à l'aide de CREATE XML SCHEMA COLLECTION.

  • Si vous transformez une chaîne en données typées xml , l'analyse se charge de la validation et de l'attribution du type en fonction des espaces de noms du schéma XML de la collection spécifiée.

  • Vous pouvez convertir des données de xml typé en xml non typé, et inversement.

Pour plus d’informations sur d’autres façons de générer du code XML dans SQL Server, consultez Créer des instances de données XML. Une fois le code XML généré, il peut être affecté à une variable de type xml ou stocké dans des colonnes de type xml en vue d'un traitement supplémentaire.

Dans la hiérarchie des types de données, le type de données xml apparaît après sql_variant et les types définis par l’utilisateur, mais avant tout type intégré.

Exemple : spécification de facettes pour limiter une colonne XML typée

Vous pouvez définir des contraintes sur des colonnes xml typées de façon à n’autoriser que des éléments uniques de premier niveau pour chaque instance qui y est stockée. Pour cela, vous devez spécifier la facette facultative DOCUMENT lors de la création de la table, comme le montre l'exemple suivant :

CREATE TABLE T(Col1 xml
   (DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO

Par défaut, les instances stockées dans la colonne typée xml sont considérées comme du contenu XML et non comme des documents XML de façon à autoriser :

  • zéro ou plusieurs éléments de premier niveau ;

  • des nœuds de texte dans les éléments de premier niveau.

Vous pouvez aussi définir ce comportement de manière explicite en ajoutant la facette CONTENT , conformément à l'exemple suivant :

CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default

Vous pouvez spécifier les facettes DOCUMENT/CONTENU facultatives partout où vous définissez le type xml (xml typé). Par exemple, quand vous créez une variable xml typée, vous pouvez ajouter la facette DOCUMENT/CONTENT, comme illustré dans l’exemple suivant :

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);

Définition de type de document (DTD)

Les colonnes, variables et paramètres de type de données xml peuvent être typés à l'aide d'un schéma XML, mais pas en utilisant DTD. Toutefois, une DTD en ligne peut être utilisée à la fois avec du code XML typé et non typé pour fournir des valeurs par défaut et remplacer des références d'entité par leur forme étendue.

Vous pouvez convertir les DTD en documents de schéma XML à l'aide d'outils tiers, puis charger les schémas XML dans la base de données.

Mise à niveau du code XML typé à partir de SQL Server 2005

SQL Server 2008 (10.0.x) a apporté plusieurs extensions à la prise en charge du schéma XML, notamment la prise en charge de la validation lax, une gestion améliorée des données d’instance xs:date, xs:time et xs:dateTime et ajout de la prise en charge des types de liste et d’union. Dans la plupart des cas, les modifications n’affectent pas l’expérience de mise à niveau. Toutefois, si vous avez utilisé une collection de schémas XML dans SQL Server 2005 (9.x) qui a autorisé les valeurs de type xs:date, xs:time ou xs:dateTime (ou tout sous-type), les étapes de mise à niveau suivantes se produisent lorsque vous attachez votre base de données SQL Server 2005 (9.x) à une version ultérieure de SQL Server :

  1. Pour chaque colonne XML qui est typée avec une collection de schémas XML contenant des éléments ou des attributs typés comme xs:anyType, xs:anySimpleType, xs:date ou l'un de ses sous-types, xs:time ou tout sous-type, ou xs:dateTime ou l'un de ses sous-types, ou qui constituent des types d'union ou de liste contenant l'un de ces types, les événements suivants ont lieu :

    1. Tous les index XML sur la colonne seront désactivés.

    2. Toutes les valeurs SQL Server 2005 (9,x) continueront d’être représentées dans le fuseau horaire Z, car elles ont été normalisées au fuseau horaire Z.

    3. Toutes les valeurs xs:date ou xs:dateTime inférieures au 1er janvier de l’année 1 entraînent une erreur d’exécution lorsque l’index obtient la reconstruction ou une instruction XQuery ou XML-DML est exécutée sur le type de données XML contenant cette valeur.

  2. Toutes les années négatives dans xs:date ou xs:dateTime facettes ou valeurs par défaut dans une collection de schémas XML sont automatiquement mises à jour vers la plus petite valeur autorisée par le type xs:date:date ou xs:dateTime de base (par exemple, 0001-01-01T00:00:0000000Z pour xs:dateTime).

Vous pouvez toujours utiliser une instruction Transact-SQL SELECT pour récupérer l’ensemble du type de données xml , même s’il contient des années négatives. Il est recommandé de remplacer les années négatives par une année dans la plage nouvellement prise en charge ou de modifier le type de l’élément ou de l’attribut en xs:string.

Voir aussi