Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo esempio viene illustrato come vengono indirizzati i dati nella colonna di overflow utilizzando la direttiva XMLTEXT in un'istruzione SELECT in modalità EXPLICIT.
Si consideri la Person tabella. Questa tabella contiene una Overflow colonna che archivia la parte non consumata 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 le colonne dalla Person tabella. Per la colonna Overflow, AttributeName non è specificato, ma la direttiva è impostata su XMLTEXT per fornire un nome di colonna di 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 viene specificato per la
Overflowcolonna e viene specificata laxmltextdirettiva , gli attributi nell'elemento vengono accodati all'elenco>overflow< di attributi dell'elemento contenitore.<Parent>Poiché l'attributo
PersonIDnell'elemento <xmltext> è in conflitto con l'attributoPersonIDrecuperato sullo stesso livello di elemento, l'attributo nell'elementoxmltext<> viene ignorato, anche sePersonIDè NULL. In genere, un attributo sostituisce un attributo con lo stesso nome nello sfondo.
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<>.
Ad esempio, modificare i dati nella Person tabella in modo che la Overflow colonna disponga ora di 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 <xmltext> vengono aggiunti come sottoelementi dell'elemento contenitore <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;
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>, è specificato insieme alla direttiva xmltext.
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 viene specificata la direttiva per l'PersonName attributo. Ciò comporta l'aggiunta PersonName come sottoelemento dell'elemento contenitore <Parent> . Gli attributi di <xmltext> vengono ancora accodati all'elemento contenitore <Parent> . I contenuti dell'elemento <overflow> e dei suoi sottoelementi sono anteposti agli altri sottoelementi degli elementi che li racchiudono <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;
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 XMLTEXT colonna contengono attributi nell'elemento radice, questi attributi non vengono visualizzati nello schema dei dati XML e il parser MSXML non convalida il frammento di documento XML risultante. Per esempio:
SELECT 1 AS Tag,
0 ASParent,
N'<overflow a="1"/>' AS 'overflow!1!!xmltext'
FOR XML EXPLICIT, xmldata;
Di seguito è riportato il risultato. Si noti che nello schema restituito l'attributo a overflow non è presente nello 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>