Comparaison du XML typé et du XML non typé

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.

Code XML bien formé et le 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, n'exige pas l'association de schémas XML avec la colonne, puis rejette les données mal formées au sens large. 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 xml non 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 de 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 voulez pas que le serveur valide les données. C'est notamment le cas lorsqu'une application effectue la validation côté client avant de stocker les données sur le serveur, ou stocke temporairement les données XML déclarées non valides par rapport au schéma, ou utilise des composants de schéma non pris en charge par 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 utiliser un indicateur pour spécifier qu'il s'agit d'un document ou d'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 de XML typé

Avant de créer des variables, des paramètres ou des colonnes xml typés, vous devez 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'appellation 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 AdventureWorks 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 : transmission d'un paramètre de type xml vers 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 la façon de générer du code XML dans SQL Server, consultez Génération d'instances 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 autre type intégré.

Exemple : définition de facettes pour imposer des contraintes sur une colonne typée xml

Vous pouvez définir des contraintes sur des colonnes typées xml 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

Remarquez que vous pouvez spécifier les facettes facultatives DOCUMENT/CONTENT chaque fois que vous définissez le type xml (xml typé). Par exemple, lorsque vous créez une variable typée xml, vous pouvez ajouter la facette DOCUMENT/CONTENT, comme le montre 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 de XML typé de SQL Server 2005 vers SQL Server 2008

SQL Server 2008 offre plusieurs extensions de prise en charge du schéma XML, y compris la prise en charge de la validation de type lax, une gestion améliorée des données d'instance xs:date, xs:time et xs:dateTime et la nouvelle 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 utilisez une collection de schémas XML dans SQL Server 2005 qui autorisait les valeurs de type xs:date, xs:time ou xs:dateTime (ou tout sous-type), les étapes de mise à niveau suivantes ont lieu lorsque vous joignez votre base de données SQL Server 2005 à SQL Server 2008 :

  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 continueront d'être représentées dans la période Z, car elles ont été normalisées selon la période Z.

    3. Toute valeur xs:date ou xs:dateTime plus petite que le 1er janvier de l'année 1 provoqueront une erreur d'exécution lorsque l'index sera reconstruit ou lorsque des instructions XQuery ou XML-DML seront exécutées contre le type de données XML contenant cette valeur.

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

Notez que vous pouvez encore utiliser une simple instruction select SQL pour extraire le type de données XML entier, même s'il contient des années négatives. Il est recommandé de remplacer les années négatives par une année comprise dans la plage nouvellement prise en charge, ou de modifier le type de l'élément ou attribut en xs:string.