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 laxmltext
direttiva , gli attributi nell'elemento vengono aggiunti all'elencooverflow
><di attributi dell'elemento che <Parent
> lo racchiude.Poiché l'attributo
PersonID
nell'elemento <xmltext
> è in conflitto con l'attributoPersonID
recuperato sullo stesso livello di elemento, l'attributo nell'elementoxmltext
<> viene ignorato, anche sePersonID
è 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>