Esempio: specifica della direttiva XMLTEXTExample: Specifying the XMLTEXT Directive

Nell'esempio seguente viene illustrata la gestione dei dati nella colonna di overflow utilizzando la direttiva XMLTEXT in un'istruzione SELECT in modalità EXPLICIT.This example illustrates how data in the overflow column is addressed by using the XMLTEXT directive in a SELECT statement using EXPLICIT mode.

Si consideri la tabella Person .Consider the Person table. La tabella contiene una colonna Overflow in cui viene archiviata la parte non utilizzata del documento XML.This table has an Overflow column that stores the unconsumed part of the XML document.

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>');  

Questa query recupera colonne dalla tabella Person .This query retrieves columns from the Person table. Per la colonna Overflow non è specificato AttributeName , ma la direttiva è impostata su XMLTEXT nell'ambito della specifica del nome della colonna della tabella universale.For the Overflow column, AttributeName is not specified, but directive is set to XMLTEXT as part of providing a universal table column name.

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;  

Nel documento XML risultante:In the resulting XML document:

  • Poiché AttributeName non è specificato per la colonna Overflow ed è specificata la direttiva xmltext, gli attributi nell'elemento <overflow> vengono accodati all'elenco attributi dell'elemento <Parent> che li racchiude.Because AttributeName is not specified for the Overflow column and the xmltext directive is specified, the attributes in the <overflow> element are appended to the attribute list of the enclosing <Parent> element.

  • Poiché l'attributo PersonID nell'elemento <xmltext> è in conflitto con l'attributo PersonID recuperato allo stesso livello dell'elemento, l'attributo dell'elemento <xmltext> viene ignorato, anche se PersonID è NULL.Because the PersonIDattribute in the <xmltext> element conflicts with the PersonID attribute retrieved on the same element level, the attribute in the <xmltext> element is ignored, even if PersonID is NULL. In linea generale, nell'overflow un attributo prevarrà sull'attributo con lo stesso nome.Generally, an attribute overrides an attribute of the same name in the overflow.

    Risultato:This is the result:

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

    Se i dati di overflow includono sottoelementi e si specifica la stessa query, i sottoelementi nella colonna Overflow vengono aggiunti come sottoelementi dell'elemento <Parent> che li racchiude.If the overflow data has subelements and the same query is specified, the subelements in the Overflow column are added as the subelements of the enclosing <Parent> element.

    Modificare, ad esempio, i dati della tabella Person in modo che la colonna Overflow includa sottoelementi.For example, change the data in the Person table so that the Overflow column now has subelements.

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>');  

Se si esegue la stessa query, i sottoelementi dell'elemento <xmltext> vengono aggiunti come sottoelementi dell'elemento <Parent> che li racchiude:If the same query is executed, the subelements in the <xmltext> element are added as subelements of the enclosing <Parent> element:

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;  

Risultato:This is the result:

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

Se si specificaAttributeName con la direttiva xmltext, gli attributi dell'elemento <overflow> vengono aggiunti come attributi dei sottoelementi dell'elemento <Parent> che li racchiude.If AttributeName is specified with the xmltext directive, the attributes of the <overflow> element are added as attributes of the subelements of the enclosing <Parent> element. Il nome specificato per AttributeName diventa il nome del sottoelemento.The name specified for AttributeName becomes the name of the subelement

Nella query seguente l'argomento AttributeName, <overflow>, viene specificato assieme alla xmltextdirettiva:In this query, AttributeName, <overflow>, is specified together with the 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  

Risultato:This is the result:

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

In questo elemento di query la direttiva viene specificata per l'attributo PersonName.In this query element, directive is specified for PersonName attribute. PersonName verrà pertanto aggiunto come sottoelemento dell'elemento <Parent> che lo racchiude.This results in PersonName being added as a subelement of the enclosing <Parent> element. Gli attributi dell'elemento <xmltext> vengono aggiunti all'elemento <Parent> che li racchiude.The attributes of the <xmltext> are still appended to the enclosing <Parent> element. Il contenuto dell'elemento <overflow> e i sottoelementi vengono anteposti agli altri sottoelementi degli elementi <Parent> che li racchiudono.The contents of the <overflow> element, subelements, are prepended to the other subelements of the enclosing <Parent> elements.

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;  

Risultato:This is the result:

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

Se i dati della colonna XMLTEXT includono attributi per l'elemento radice, tali attributi non compaiono nello schema dei dati XML e il parser MSXML non convalida il frammento di documento XML risultante.If the XMLTEXT column data contains attributes on the root element, these attributes are not shown in the XML data schema and the MSXML parser does not validate the resulting XML document fragment. Esempio:For example:

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

Di seguito è riportato il risultato.This is the result. L'attributo di overflow a manca dallo schema restituito:Note that in the returned schema, the overflow attribute a is missing from the schema:

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

Vedere ancheSee Also

Utilizzo della modalità EXPLICIT con FOR XMLUse EXPLICIT Mode with FOR XML