Condividi tramite


Esempio: Specifica della direttiva XMLTEXT

Nell'esempio seguente viene illustrata la gestione dei dati nella colonna di overflow utilizzando la direttiva XMLTEXT in un'istruzione SELECT in modalità EXPLICIT.

Si consideri la tabella Person . La tabella contiene una colonna Overflow in cui viene archiviata la parte non utilizzata del documento 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>');  

Questa query recupera colonne dalla tabella Person . Per la colonna Overflow non è specificato AttributeName , ma la direttiva è impostata su XMLTEXT nell'ambito della specifica del nome della colonna della tabella universale.

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;  

Nel documento XML risultante:

  • Poiché AttributeName non è specificato per la Overflow colonna e viene specificata la xmltext direttiva , gli attributi nell'elemento vengono aggiunti all'elencooverflow><di attributi dell'elemento che <Parent> lo racchiude.

  • Poiché l'attributo PersonIDnell'elemento <xmltext> è in conflitto con l'attributo PersonID recuperato sullo stesso livello di elemento, l'attributo nell'elementoxmltext<> viene ignorato, anche se PersonID è NULL. In linea generale, nell'overflow un attributo prevarrà sull'attributo con lo stesso nome.

Risultato:

<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 hanno sottoelementi e viene specificata la stessa query, i sottoelementi nella Overflow colonna vengono aggiunti come sottoelementi dell'elemento contenitoreParent<>.

Modificare, ad esempio, i dati della tabella Person in modo che la colonna Overflow includa sottoelementi.

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 viene eseguita la stessa query, i sottoelementi nell'elemento vengono aggiunti come sottoelementi dell'elemento contenitore<>Parent:<xmltext>

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:

<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 AttributeName viene specificato con la xmltext direttiva , gli attributi dell'elemento>overflow< vengono aggiunti come attributi dei sottoelementi dell'elemento contenitore.<Parent> Il nome specificato per AttributeName diventa il nome del sottoelemento.

In questa query AttributeName, <overflow>, viene specificato insieme alla xmltext direttiva :

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:

<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 . Ciò comporta PersonName l'aggiunta come sottoelemento dell'elemento contenitore <Parent> . Gli attributi di <xmltext> vengono ancora accodati all'elemento contenitore <Parent> . Il contenuto dell'elemento, dei sottoelementi, viene anteporto agli altri sottoelementi degli elementi che lo racchiudono<Parent>.<overflow>

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:

<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. Ad esempio:

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

Di seguito è riportato il risultato. L'attributo di overflow a manca dallo schema restituito:

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

Usare la modalità EXPLICIT con FOR XML