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><Summary>This is summary description</Summary></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