Partilhar via


Exemplo: Especifique a diretiva XMLTEXT

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Este exemplo ilustra como são tratados os dados na coluna de estouro usando a diretiva XMLTEXT numa declaração SELECT em modo EXPLICIT.

Considere a Person tabela. Esta tabela tem uma Overflow coluna 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>');

Esta consulta recupera colunas da Person tabela. Para a Overflow coluna, AttributeName não está especificado, mas a diretiva é definida como XMLTEXT como parte do fornecimento de um nome universal para a coluna da tabela.

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;

No documento XML resultante:

  • Como AttributeName não é especificado para a Overflow coluna e a xmltext diretiva é especificada, os <overflow> atributos no elemento são acrescentados à lista de atributos do elemento de delimitação <Parent> .

  • Como o atributo PersonID no elemento <xmltext> entra em conflito com o atributo PersonID recuperado no mesmo nível de elemento, o atributo no elemento <xmltext> é ignorado, mesmo que PersonID seja NULL. Geralmente, um atributo substitui um atributo do mesmo nome no transbordo.

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 coluna Overflow serão adicionados como subelementos do elemento circundante <Parent>.

Por exemplo, altere os Person dados na tabela para que a Overflow coluna 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 de delimitação <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 <overflow> atributos do elemento serão adicionados como atributos dos subelementos do elemento de delimitação <Parent> . O nome especificado para AttributeName torna-se o nome do subelemento

Nesta consulta, AttributeName, <overflow>, é especificado juntamente 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, diretiva é especificada para PersonName atributo. Isso resulta em PersonName ser adicionado como um subelemento do elemento de inclusão <Parent> . Os atributos do <xmltext> ainda são anexados ao elemento de encerramento <Parent> . O conteúdo do elemento <overflow>, incluindo os seus subelementos, é adicionado antes dos outros subelementos dos elementos que envolvem <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 XMLTEXT coluna 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 de documento XML resultante. Por exemplo:

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

Este é o resultado. No esquema retornado, o atributo a overflow está ausente do 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>

Ver também