Compartir a través de


Ejemplo: Especificar la directiva ELEMENT y la codificación de entidades

Este ejemplo muestra la diferencia entre las directivas ELEMENT y XML. La directiva ELEMENT crea entidades para los datos, pero la directiva XML no lo hace. Al elemento <Summary> se le asigna XML, <Summary>This is summary description</Summary>, en la consulta.

Considere esta consulta:

SELECT  1 as Tag,
        0 as Parent,
        ProductModelID  as [ProductModel!1!ProdModelID],
        Name            as [ProductModel!1!Name],
        NULL            as [Summary!2!SummaryDescription!ELEMENT]
FROM    Production.ProductModel
WHERE   ProductModelID=19
UNION ALL
SELECT  2 as Tag,
        1 as Parent,
        ProductModelID,
        NULL,
       '<Summary>This is summary description</Summary>'
FROM   Production.ProductModel
WHERE  ProductModelID=19
FOR XML EXPLICIT

Éste es el resultado. Se crea una entidad en el resultado para la descripción resumida.

<ProductModel ProdModelID="19" Name="Mountain-100">
  <Summary>
    <SummaryDescription>&lt;Summary&gt;This is summary description&lt;/Summary&gt;</SummaryDescription>
  </Summary>
</ProductModel>

Ahora, si se especifica la directiva XML en el nombre de columna Summary!2!SummaryDescription!XML, en lugar de la directiva ELEMENT, se recibirá la descripción resumida sin la creación de entidades.

<ProductModel ProdModelID="19" Name="Mountain-100">
  <Summary>
    <SummaryDescription>
      <Summary>This is summary description</Summary>
    </SummaryDescription>
  </Summary>
</ProductModel>

En lugar de asignar un valor XML estático, la consulta siguiente usa el método query() del tipo xml para recuperar la descripción resumida del modelo de productos de la columna CatalogDescription de tipo xml. Como se sabe que el resultado es de tipo xml, no se aplica la creación de entidades.

SELECT  1 as Tag,
        0 as Parent,
        ProductModelID  as [ProductModel!1!ProdModelID],
        Name            as [ProductModel!1!Name],
        NULL            as [Summary!2!SummaryDescription]
FROM    Production.ProductModel
WHERE   CatalogDescription is not null
UNION ALL
SELECT  2 as Tag,
        1 as Parent,
        ProductModelID,
        Name,
       (SELECT CatalogDescription.query('
            declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
          /pd:ProductDescription/pd:Summary'))
FROM     Production.ProductModel
WHERE    CatalogDescription is not null
ORDER BY [ProductModel!1!ProdModelID],Tag
FOR XML EXPLICIT

Vea también

Referencia