Exemplo: Especificando a diretiva XMLTEXT
Este exemplo ilustra como dados na coluna de estouro são resolvidos usando a diretiva XMLTEXT
em uma instrução SELECT
no modo EXPLICIT.
Considere a tabela Person
. Esta tabela tem uma coluna Overflow
que armazena a parte não consumida do 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>');
Essa consulta recupera colunas da tabela Person
. Para a coluna Overflow
, AttributeName não é especificado, mas directive é definida como XMLTEXT
, como parte do fornecimento de um nome de coluna da tabela universal.
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;
No documento XML resultante:
Como AttributeName não é especificado para a
Overflow
coluna e axmltext
diretiva é especificada, os atributos no>overflow
< elemento são acrescentados à lista de atributos do elemento delimitador.<Parent
>Como o
PersonID
atributo no elemento está em <xmltext
> conflito com oPersonID
atributo recuperado no mesmo nível de elemento, o atributo noxmltext
<> elemento é ignorado, mesmo quePersonID
seja NULL. Geralmente, um atributo substitui um atributo do mesmo nome no estouro.
Este é o resultado:
<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 os dados de estouro tiverem subelementos e a mesma consulta for especificada, os subelementos na Overflow
coluna serão adicionados como subelementos do elemento delimitador <Parent
> .
Por exemplo, altere os dados na tabela Person
para que a coluna Overflow
agora tenha subelementos.
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 a mesma consulta for executada, os subelementos no <xmltext
> elemento serão adicionados como subelementos do elemento delimitador:<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;
Este é o resultado:
<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 for especificado com a xmltext
diretiva , os atributos do>overflow
< elemento serão adicionados como atributos dos subelementos do elemento delimitador.<Parent
> O nome especificado para AttributeName torna-se o nome do subelemento.
Nessa consulta, AttributeName, <overflow
>, é especificado junto com a xmltext
diretiva :
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
Este é o resultado:
<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>
Neste elemento de consulta, directive está especificada para o atributo PersonName
. Isso resulta na adição PersonName
como um subelemento do elemento delimitadorParent
<>. Os atributos do <xmltext
> ainda são acrescentados ao elemento delimitador.<Parent
> O conteúdo do <overflow
> elemento, subelementos, é anexado aos outros subelementos dos elementos delimitador.<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;
Este é o resultado:
<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 os dados da coluna XMLTEXT
contiverem atributos no elemento raiz, esses atributos não serão mostrados no esquema de dados XML e o analisador MSXML não validará o fragmento do documento XML resultante. Por exemplo:
SELECT 1 AS Tag,
0 ASParent,
N'<overflow a="1"/>' AS 'overflow!1!!xmltext'
FOR XML EXPLICIT, xmldata;
Este é o resultado. Observe que no esquema retornado, o atributo de estouro a
não será encontrado no esquema:
<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>