Exemplo: especificar a diretiva XMLTEXT

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de Dados SQL no Microsoft Fabric

Este exemplo ilustra como os dados na coluna de transbordamento são tratados usando a diretiva XMLTEXT em uma instrução SELECT que usa o 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 a diretiva é definida como XMLTEXT como parte do fornecimento de um nome de coluna de tabela universal.

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 está especificado para a coluna Overflow e a diretiva xmltext está especificada, os atributos no elemento <overflow> são acrescentados à lista de atributos do elemento <Parent> delimitador.

  • Como o atributo PersonID no elemento <xmltext> conflita 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 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 excedentes tiverem subelementos e a mesma consulta for especificada, os subelementos na coluna Overflow serão adicionados como os subelementos do elemento <Parent> delimitador.

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 elemento <xmltext> serão adicionados como subelementos do elemento <Parent> delimitador:

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 diretiva xmltext, os atributos do elemento <overflow> serão adicionados como atributos dos subelementos do elemento <Parent> delimitador. O nome especificado para AttributeName se torna o nome do subelemento.

Nesta consulta, AttributeName, <overflow>, é especificado junto com a diretiva 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;

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 de PersonName como um subelemento do elemento <Parent> delimitador. Os atributos de <xmltext> ainda estão anexados ao elemento <Parent> delimitador. O conteúdo do elemento <overflow> e os subelementos são pré-acrescentados a outros subelementos dos elementos <Parent> delimitadores.

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 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 excedente a está ausente:

<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>