Exemple : Spécifier la directive XMLTEXT
S’applique à :SQL Server
Azure SQL Database
Azure 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 laxmltext
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
PersonID
dans l’élément<xmltext>
est en conflit avec l’attributPersonID
récupéré au même niveau d’élément, l’attribut de l’élément<xmltext>
est ignoré, même s’ilPersonID
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
Commentaires
https://aka.ms/ContentUserFeedback.
Prochainement : Tout au long de l'année 2024, nous supprimerons progressivement les GitHub Issues en tant que mécanisme de retour d'information pour le contenu et nous les remplacerons par un nouveau système de retour d'information. Pour plus d’informations, voir:Soumettre et afficher des commentaires pour