Partager via


Exemple : spécification de la directive XMLTEXT

Cet exemple illustre comment les données de la colonne de débordement sont traitées à l'aide de la directive XMLTEXT dans une instruction SELECT utilisant le mode EXPLICIT.

Considérez le Person tableau. Cette table contient une Overflow colonne qui stocke la partie nonconsumée 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>');  

Cette requête récupère les colonnes de la Person table. 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!!XMLTEST] -- No AttributeName; XMLTEXT directive  
FROM Person  
FOR XML EXPLICIT;  

Dans le document XML résultant :

  • É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émentxmltext<> est ignoré, même s’il PersonID est NULL. En règle générale, un attribut remplace un attribut du même nom dans le débordement.

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 englobantParent<>.

Par exemple, modifiez les données de la Person table afin que la Overflow colonne dispose désormais de 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 cet élément de requête, la directive est spécifiée pour PersonName l’attribut. Cela entraîne l’ajout de PersonName en 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>, ainsi que ses sous-éléments, est préfixé 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 ASParent,  
       N'<overflow a="1"/>' AS 'overflow!1!!xmltext'  
FOR XML EXPLICIT, xmldata;  

Voici le résultat. Notez que 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

Utiliser le mode EXPLICIT avec FOR XML