Partager via


Exemple : Spécifier la directive XMLTEXT

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

Cet exemple illustre l’adressage des informations contenues dans la colonne de dépassement de capacité à l’aide de la directive XMLTEXT dans une instruction SELECT utilisant le mode EXPLICIT.

Soit la table Person . Cette table possède une colonne nommée Overflow , qui stocke les données non consommées du document XML.

USE tempdb;
GO
CREATE TABLE Person(PersonID varchar(5), PersonName varchar(20), Overflow nvarchar(200));
GO
INSERT INTO Person VALUES
    ('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')
   ,('P2','Joe',N'<SomeTag attr2="data"/>')
   ,('P3','Joe',N'<SomeTag attr3="data" PersonID="P">content</SomeTag>');

La requête suivante extrait des colonnes de la table Person . Pour la Overflow colonne, AttributeName n’est pas spécifié, mais la directive est définie XMLTEXT dans le cadre de la fourniture d’un nom de colonne de table universel.

SELECT 1 as Tag, NULL as parent,
       PersonID as [Parent!1!PersonID],
       PersonName as [Parent!1!PersonName],
       Overflow as [Parent!1!!XMLTEXT] -- No AttributeName; XMLTEXT directive
FROM Person
FOR XML EXPLICIT;

Dans le document XML obtenu :

  • Étant donné que AttributeName n’est pas spécifié pour la Overflow colonne et que la xmltext directive est spécifiée, les attributs de l’élément <overflow> sont ajoutés à la liste d’attributs de l’élément englobant<Parent>.

  • Étant donné que l’attribut PersonIDdans l’élément <xmltext> est en conflit avec l’attribut PersonID récupéré au même niveau d’élément, l’attribut de l’élément <xmltext> est ignoré, même s’il PersonID est NULL. En général, un attribut remplace un attribut de même nom dans les données en excès.

Voici le résultat obtenu :

<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>
<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>
<Parent PersonID="P3" PersonName="Joe" attr3="data">content</Parent>

Si les données de dépassement de capacité ont des sous-éléments et que la même requête est spécifiée, les sous-éléments de la Overflow colonne sont ajoutés en tant que sous-éléments de l’élément englobant <Parent> .

Supposons, par exemple, que les données de la table Person sont modifiées afin que la colonne Overflow contienne des sous-éléments.

USE tempdb;
GO
TRUNCATE TABLE Person;
GO
INSERT INTO Person VALUES
    ('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')
   ,('P2','Joe',N'<SomeTag attr2="data"/>')
    ,('P3','Joe',N'<SomeTag attr3="data" PersonID="P"><name>PersonName</name></SomeTag>');

Si la même requête est exécutée, les sous-éléments de l’élément <xmltext> sont ajoutés en tant que sous-éléments de l’élément englobant <Parent> :

SELECT 1 as Tag, NULL as parent,
       PersonID as [Parent!1!PersonID],
       PersonName as [Parent!1!PersonName],
       Overflow as [Parent!1!!XMLTEXT] -- no AttributeName, XMLTEXT directive
FROM Person
FOR XML EXPLICIT;

Voici le résultat obtenu :

<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>
<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>
<Parent PersonID="P3" PersonName="Joe" attr3="data">
<name>PersonName</name>
</Parent>

Si AttributeName est spécifié avec la xmltext directive, les attributs de l’élément <overflow> sont ajoutés en tant qu’attributs des sous-éléments de l’élément englobant <Parent> . Le nom spécifié pour AttributeName devient le nom du sous-élément.

Dans cette requête, AttributeName, <overflow>est spécifié avec la xmltext directive*:*

SELECT 1 as Tag, NULL as parent,
       PersonID as [Parent!1!PersonID],
       PersonName as [Parent!1!PersonName],
       Overflow as [Parent!1!overflow!XMLTEXT] -- Overflow is AttributeName
                      -- XMLTEXT is a directive
FROM Person
FOR XML EXPLICIT;

Voici le résultat obtenu :

<Parent PersonID="P1" PersonName="Joe">
<overflow attr1="data">content</overflow>
</Parent>
<Parent PersonID="P2" PersonName="Joe">
<overflow attr2="data" />
</Parent>
<Parent PersonID="P3" PersonName="Joe">
<overflow attr3="data" PersonID="P">
<name>PersonName</name>
</overflow>
</Parent>

Dans l’élément de requête suivant, l’argument directive est spécifié pour l’attribut PersonName . Cela entraîne l’ajout en PersonName tant que sous-élément de l’élément englobant <Parent> . Les attributs du fichier <xmltext> sont toujours ajoutés à l’élément englobant <Parent> . Le contenu de l’élément <overflow> , sous-éléments, est ajouté aux autres sous-éléments des éléments englobants <Parent> .

SELECT 1      AS Tag, NULL as parent,
       PersonID   AS [Parent!1!PersonID],
       PersonName AS [Parent!1!PersonName!element], -- element directive
       Overflow   AS [Parent!1!!XMLTEXT]
FROM Person
FOR XML EXPLICIT;

Voici le résultat obtenu :

<Parent PersonID="P1" attr1="data">content<PersonName>Joe</PersonName>
</Parent>
<Parent PersonID="P2" attr2="data">
<PersonName>Joe</PersonName>
</Parent>
<Parent PersonID="P3" attr3="data">
<name>PersonName</name>
<PersonName>Joe</PersonName>
</Parent>

Si les XMLTEXT données de colonne contiennent des attributs sur l’élément racine, ces attributs ne sont pas affichés dans le schéma de données XML et l’analyseur MSXML ne valide pas le fragment de document XML résultant. Par exemple :

SELECT 1 AS Tag,
       0 AS Parent,
       N'<overflow a="1"/>' AS 'overflow!1!!xmltext'
FOR XML EXPLICIT, xmldata;

Voici l'ensemble de résultats. Dans le schéma retourné, l’attribut a de dépassement de capacité est manquant dans le schéma :

<Schema name="Schema2"
xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="overflow" content="mixed" model="open">`
</ElementType>`
</Schema>`
<overflow xmlns="x-schema:#Schema2" a="1">
</overflow>

Voir aussi