Type de données xml

Le type de données xml vous permet de stocker des fragments et des documents XML dans une base de données SQL Server. Un fragment XML est une instance XML à laquelle fait défaut un élément niveau supérieur unique. Vous pouvez créer des colonnes et des variables du type xml et y stocker des instances XML. La représentation stockée d'instances de type de données xml ne peut pas dépasser 2 Go.

Vous pouvez éventuellement associer une collection de schémas XML à une colonne, à un paramètre ou à une variable du type de données xml. Les schémas de la collection permettent de valider et de typer les instances XML. Dans ce cas, le document XML est dit « typé ».

Le type de données xml et les méthodes associées facilitent l'intégration du document XML dans l'infrastructure relationnelle de SQL Server. Pour plus d'informations, consultez Méthodes des types de données xml.

ms189887.note(fr-fr,SQL.90).gifRemarque :
Cette rubrique décrit les données XML non typées. Pour plus d'informations sur les données XML typées, consultez XML typé et non typé.

Création de variables et de colonnes de type de données xml

Le type de données xml est un type de données intégré de SQL Server, quelque peu similaire aux autres types intégrés, tels que int et varchar. À l'image des autres types intégrés, vous pouvez utiliser le type de données xml comme type de colonne lorsque vous créez une table en tant que type de variable, de paramètre, de retour de fonction ou dans CAST et CONVERT. Ces différentes possibilités sont illustrées dans les exemples suivants.

Exemple A

Créer une colonne de type xml :

CREATE TABLE T1(Col1 int primary key, Col2 xml) 

Exemple B

Créer une variable de type xml :

DECLARE @x xml 

Créer une variable xml typée en spécifiant une collection de schémas XML :

declare @x xml (Sales.StoreSurveySchemaCollection)

Exemple C

Transmettre un paramètre de type xml à une procédure stockée :

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ... 

Vous pouvez utiliser XQuery pour interroger des instances XML stockées dans des colonnes, paramètres ou variables. Vous pouvez également utiliser le langage DML XML (XML Data Manipulation Language) pour appliquer des mises à jour aux instances XML. Le développement du standard XQuery n'ayant pas donné lieu à la définition d'une syntaxe DML XQuery, SQL Server introduit des extensions DML XML (XML Data Modification Language) à XQuery. Ces extensions vous permettent de réaliser des opérations d'insertion, de mise à jour et de suppression.

Affectation de valeurs par défaut

Dans une table, vous pouvez affecter une instance XML par défaut à une colonne de type xml. Vous pouvez fournir le document XML par défaut de deux façons, comme l'illustrent les exemples ci-après.

Exemple A

Communication de l'instance XML par défaut en tant que constante XML (la chaîne est implicitement convertie en type xml) :

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Exemple B

Communication de l'instance XML par défaut sous la forme d'un CAST explicite en xml :

CREATE TABLE T (XmlColumn xml 
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server prend également en charge les contraintes NULL et NOT NULL sur des colonnes de type xml. Exemple :

CREATE TABLE T (XmlColumn xml NOT NULL)

Spécification de contraintes

Lorsque vous créez des colonnes de type xml, vous pouvez définir des contraintes de niveau colonne ou de niveau table. Toutefois, vous ne pouvez pas utiliser les méthodes de type de données xml lorsque vous spécifiez des contraintes. Une solution consiste à créer un wrapper, fonction définie par l'utilisateur permettant d'inclure la méthode de type de données xml, et à spécifier cette fonction dans la contrainte de validation, comme le montre l'exemple ci-après.

Dans l'exemple suivant, la contrainte sur Col2 spécifie que chaque instance XML stockée dans cette colonne doit posséder un élément <ProductDescription> doté d'un attribut ProductID. Cette contrainte est appliquée par cette fonction définie par l'utilisateur :

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN 
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO

La méthode exist() du type de données xml renvoie 1 si l'élément <ProductDescription> de l'instance contient l'attribut ProductID. Dans le cas contraire, elle renvoie la valeur 0.

Maintenant, vous pouvez créer une table dotée d'une contrainte de niveau colonne, comme suit :

CREATE TABLE T (
    Col1 int primary key, 
    Col2 xml check(dbo.my_udf(Col2)=1))
GO

L'insertion suivante réussit :

INSERT INTO T values(1,'<ProductDescription ProductID="1" />')

La contrainte fait échouer l'insertion suivante :

INSERT INTO T values(1,'<Product />')

Modification de tables

L'instruction ALTER TABLE prend en charge le type de données xml. Par exemple, vous pouvez modifier n'importe quelle colonne de type chaîne au type de données xml. Dans ces cas-là, les documents contenus dans la colonne doivent être corrects. En outre, si vous convertissez la colonne du type chaîne dans le type xml typé, les documents de la colonne sont validés par rapport aux schémas XSD spécifiés.

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T 
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T 
ALTER COLUMN Col2 xml
GO

Vous pouvez convertir une colonne de type xml non typée en colonne XML typée. Exemple :

CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T 
values (1, '<p1:ProductDescription ProductModelID="1" 
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
            </p1:ProductDescription>')
GO 
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T 
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO
ms189887.note(fr-fr,SQL.90).gifRemarque :
Le script sera exécuté sur la base de données AdventureWorks car la collection de schémas XML, Production.ProductDescriptionSchemaCollection, est créée dans le cadre de la base de données AdventureWorks.

Dans l'exemple précédent, toutes les instances stockées dans la colonne sont validées et typées par rapport aux schémas XSD de la collection spécifiée. Si la colonne contient une ou plusieurs instances XML non valides au regard du schéma spécifié, l'instruction ALTER TABLE échoue et vous ne pouvez pas convertir la colonne XML non typée en colonne XML typée.

ms189887.note(fr-fr,SQL.90).gifRemarque :
Si une table est volumineuse, la modification d'une colonne de type xml peut s'avérer coûteuse. En effet, le système doit vérifier que chaque document est correct et, s'il s'agit d'un document XML typé, il doit le valider.

Pour plus d'informations sur les données XML typées, consultez XML typé et non typé.

Création de vues

Vous pouvez utiliser une colonne de type xml pour créer des vues. L'exemple suivant crée une vue dans laquelle la valeur d'une colonne de type xml est extraite à l'aide de la méthode value() du type de données xml.

-- Create the table.
CREATE TABLE T (
    ProductID          int primary key, 
    CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName 
-- attribute value from the XML).
CREATE VIEW MyView AS 
  SELECT ProductID,
         CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
  FROM T
GO 

Exécutez la requête suivante sur la vue :

SELECT * 
FROM   MyView

Voici le résultat obtenu :

ProductID   PName      
----------- ------------
1           SomeName 
ms189887.note(fr-fr,SQL.90).gifRemarque :
Le type de données xml ne peut pas être utilisé dans les vues partitionnées distribuées.

Utilisation de données XML dans les colonnes calculées

Une instance XML peut faire office de source ou de type de colonne calculée. Par exemple, dans l'instruction CREATE TABLE suivante, une colonne de type xml (col2) est calculée à partir de col1 :

CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )  

Le type de données xml peut également faire office de source pour la création d'une colonne calculée, comme le montre l'instruction CREATE TABLE suivante :

CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) )) 

Vous pouvez créer une colonne calculée en extrayant une valeur d'une colonne de type xml, comme le montre l'exemple ci-après. Étant donné que les méthodes de type de données xml ne peuvent pas être directement utilisées pour créer des colonnes calculées, l'exemple définit d'abord une fonction (my_udf) qui renvoie une valeur d'une instance XML. La fonction inclut la méthode value() du type xml. Le nom de la fonction est ensuite spécifié dans l'instruction CREATE TABLE de la colonne calculée.

CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN 
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row. 
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
 

Comme l'exemple précédent, l'exemple suivant définit une fonction afin de renvoyer une instance de type xml pour une colonne calculée. Dans la fonction, la méthode query() du type de données xml extrait une valeur d'un paramètre de type xml.

CREATE FUNCTION my_udf(@var xml) 
  RETURNS xml AS 
BEGIN 
   RETURN @var.query('ProductDescription/Features')
END

Dans l'instruction CREATE TABLE suivante, Col2 est une colonne calculée qui utilise les données XML (élément <Features>) renvoyées par la fonction :

CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
  <Features>
    <Feature1>description</Feature1>
    <Feature2>description</Feature2>
  </Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T

Voir aussi

Référence

Utilisation de FOR XML et OPENXML pour publier et traiter des données XML

Concepts

XML typé et non typé
Génération d'instances XML
Langage de modification de données XML (XML DML)
Index portant sur des colonnes de type xml
Exemples d'applications XML

Autres ressources

Méthodes des types de données xml

Aide et Informations

Assistance sur SQL Server 2005