Compartilhar via


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 a xmltext diretiva é especificada, os atributos no>overflow< elemento são acrescentados à lista de atributos do elemento delimitador.<Parent>

  • Como o PersonIDatributo no elemento está em <xmltext> conflito com o PersonID atributo recuperado no mesmo nível de elemento, o atributo noxmltext<> elemento é ignorado, mesmo que PersonID 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>

Consulte Também

Usar o modo EXPLICIT com FOR XML